import java.util.List;
import java.util.Map;
import java.util.RandomAccess;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import java.util.stream.Collectors;
import jp.sourceforge.jindolf.corelib.PreDefAvatar;
* <p>設計メモ: 未知のAvatar出現に備え、
* {@link PreDefAvatar}と分離したクラスとして設計された。
*
- * <p>2020-03現在、既知のAvatarは最大20種類で固定。
+ * <p>2020-03現在、Avatarは20インスタンスで固定。
* Z国含め未知のAvatarが追加されるケースは今後考慮しない。
*/
public class Avatar implements Comparable<Avatar> {
/** ゲルト。 */
public static final Avatar AVATAR_GERD;
- private static final List<Avatar> AVATAR_LIST;
- private static final Map<String, Avatar> AVATAR_FN_MAP;
- private static final Map<String, Avatar> AVATAR_ID_MAP;
+ private static final List<Avatar> AVATAR_LIST = buildAvatarList();
+ private static final Map<String, Avatar> AVATAR_FN_MAP = new HashMap<>();
+ private static final Map<String, Avatar> AVATAR_ID_MAP = new HashMap<>();
- private static final Pattern AVATAR_PATTERN;
static{
- List<PreDefAvatar> predefs = CoreData.getPreDefAvatarList();
- AVATAR_LIST = buildAvatarList(predefs);
-
- AVATAR_FN_MAP = new HashMap<>();
- AVATAR_ID_MAP = new HashMap<>();
AVATAR_LIST.forEach(avatar -> {
String fullName = avatar.getFullName();
String avatarId = avatar.getIdentifier();
AVATAR_ID_MAP.put(avatarId, avatar);
});
- StringBuilder avatarGroupRegex = new StringBuilder();
- AVATAR_LIST.stream().map((avatar) ->
- avatar.getFullName()
- ).forEachOrdered((fullName) -> {
- if(avatarGroupRegex.length() > 0){
- avatarGroupRegex.append('|');
- }
- avatarGroupRegex.append('(')
- .append(Pattern.quote(fullName))
- .append(')');
- });
- AVATAR_PATTERN = Pattern.compile(avatarGroupRegex.toString());
-
- AVATAR_GERD = getAvatarByFullname("楽天家 ゲルト");
+ AVATAR_GERD = getAvatarById("gerd");
assert AVATAR_LIST instanceof RandomAccess;
assert AVATAR_GERD != null;
private final String fullName;
private final int idNum;
private final String identifier;
- private final int hashNum;
/**
* constructor.
*
+ * <p>全ての引数は他のインスタンスに対しユニークでなければならない。
+ *
* @param name 名前
* @param jobTitle 職業名
* @param idNum 通し番号
String jobTitle,
int idNum,
String identifier ){
+ super();
+
this.name = name.intern();
this.jobTitle = jobTitle.intern();
this.idNum = idNum;
this.fullName = (this.jobTitle + " " + this.name).intern();
- this.hashNum = this.fullName.hashCode() ^ this.idNum;
-
- return;
- }
-
- /**
- * constructor.
- *
- * @param fullName フルネーム
- */
- // TODO 当面は呼ばれないはず。Z国とか向け。
- public Avatar(String fullName){
- this.fullName = fullName.intern();
- this.idNum = -1;
-
- String[] tokens = this.fullName.split("\\p{Blank}+", 2);
- if(tokens.length == 1){
- this.jobTitle = null;
- this.name = this.fullName;
- }else if(tokens.length == 2){
- this.jobTitle = tokens[0].intern();
- this.name = tokens[1].intern();
- }else{
- this.jobTitle = null;
- this.name = null;
- assert false;
- }
-
- this.identifier = "???".intern();
-
- this.hashNum = this.fullName.hashCode() ^ this.idNum;
-
return;
}
/**
- * 定義済みAvatarのAvatarリストを生成する。
+ * Avatarリストを生成する。
+ *
+ * Avatarの全インスタンスはこのリストに含まれる。
*
- * @param predefs 定義済みAvatar元データ群
* @return ソートされた定義済みAvatarのリスト
*/
- private static List<Avatar> buildAvatarList(List<PreDefAvatar> predefs){
+ private static List<Avatar> buildAvatarList(){
List<Avatar> result;
+ List<PreDefAvatar> predefs = CoreData.getPreDefAvatarList();
result = predefs.stream()
.map(preDefAvatar -> toAvatar(preDefAvatar))
.sorted()
String jobTitle = pre.getJobTitle();
int serialNo = pre.getSerialNo();
String avatarId = pre.getAvatarId();
+
Avatar result = new Avatar(shortName, jobTitle, serialNo, avatarId);
return result;
}
* @param fullNameArg Avatarのフルネーム
* @return Avatar。フルネームが一致するAvatarが無ければnull
*/
- // TODO 20キャラ程度ならListをなめる方が早いか?
public static Avatar getAvatarByFullname(String fullNameArg){
return AVATAR_FN_MAP.get(fullNameArg);
}
/**
- * フルネームに合致するAvatarを返す。
- *
- * @param fullNameArg Avatarのフルネーム
- * @return Avatar。フルネームが一致するAvatarが無ければnull
- */
- public static Avatar getAvatarByFullname(CharSequence fullNameArg){
- for(Avatar avatar : AVATAR_LIST){
- String avatarName = avatar.getFullName();
- if(avatarName.contentEquals(fullNameArg)){
- return avatar;
- }
- }
- return null;
- }
-
- /**
* IDに合致するAvatarを返す。
*
* @param avatarId AvatarのID
* @return Avatar。IDが一致するAvatarが無ければnull
*/
- // TODO 20キャラ程度ならListをなめる方が早いか?
public static Avatar getAvatarById(String avatarId){
return AVATAR_ID_MAP.get(avatarId);
}
- /**
- * 定義済みAvatar名に一致しないか調べる。
- *
- * @param matcher マッチャ
- * @return 一致したAvatar。一致しなければnull。
- */
- public static Avatar lookingAtAvatar(Matcher matcher){
- matcher.usePattern(AVATAR_PATTERN);
-
- if( ! matcher.lookingAt() ) return null;
- int groupCt = matcher.groupCount();
- for(int group = 1; group <= groupCt; group++){
- if(matcher.start(group) >= 0){
- Avatar avatar = AVATAR_LIST.get(group - 1);
- return avatar;
- }
- }
-
- return null;
- }
/**
* フルネームを取得する。
}
/**
- * 識別文字列を返す。
+ * AvatarID識別文字列を返す。
*
* @return 識別文字列
*/
/**
* {@inheritDoc}
*
- * @param obj {@inheritDoc}
- * @return {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj){
- if(this == obj){
- return true;
- }
-
- if( ! (obj instanceof Avatar) ){
- return false;
- }
- Avatar other = (Avatar) obj;
-
- boolean nameMatch = this.fullName.equals(other.fullName);
- boolean idMatch = this.idNum == other.idNum;
-
- if(nameMatch && idMatch) return true;
-
- return false;
- }
-
- /**
- * {@inheritDoc}
- *
- * @return {@inheritDoc}
- */
- @Override
- public int hashCode(){
- return this.hashNum;
- }
-
- /**
- * {@inheritDoc}
- *
* @return {@inheritDoc}
*/
@Override
package jp.sfjp.jindolf.data;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
result = Avatar.getAvatarByFullname("農夫 ヤコブ");
assertNotNull(result);
assertTrue(result.equals(result));
- result = Avatar.getAvatarByFullname((CharSequence)"農夫 ヤコブ");
- assertNotNull(result);
- assertTrue(result.equals(result));
- return;
- }
-
- /**
- * Test of lookingAtAvatar method, of class Avatar.
- */
- @Test
- public void testMatchAvatar(){
- System.out.println("matchAvatar");
- Matcher matcher;
- Avatar avatar;
-
- Pattern pattern = Pattern.compile(".+");
-
- matcher = pattern.matcher("農夫 ヤコブ");
- avatar = Avatar.lookingAtAvatar(matcher);
- assertNotNull(avatar);
- assertEquals("農夫 ヤコブ", avatar.getFullName());
-
- matcher = pattern.matcher("農夫 ヤコブXYZ");
- avatar = Avatar.lookingAtAvatar(matcher);
- assertNotNull(avatar);
- assertEquals("農夫 ヤコブ", avatar.getFullName());
-
- matcher = pattern.matcher("ABC農夫 ヤコブ");
- avatar = Avatar.lookingAtAvatar(matcher);
- assertNull(avatar);
-
- matcher = pattern.matcher("農夫 ヤコブならず者 ディーター");
- avatar = Avatar.lookingAtAvatar(matcher);
- assertNotNull(avatar);
- assertEquals("農夫 ヤコブ", avatar.getFullName());
- int regionStart;
- int regionEnd;
- regionStart = matcher.end();
- regionEnd = matcher.regionEnd();
- matcher.region(regionStart, regionEnd);
- avatar = Avatar.lookingAtAvatar(matcher);
- assertNotNull(avatar);
- assertEquals("ならず者 ディーター", avatar.getFullName());
-
return;
}