我正在开发一款游戏,该游戏中有一个组件会根据其属性为生物指定一个特定的名称。具体来说,我有一组整数告诉我游戏中的生物拥有哪些属性,我需要从这些特定属性中制定一个名称。
我的想法是:为每个数字1-47(通过Hashmap)分配一个音节,这种方式取决于动物所具有的字符串属性是不同的。然而,一个明显的缺陷是字符串太长了。我写了一个算法,如果有超过4个音节,它基本上结合了音节。然而,这种类型的方法产生了许多类似的结果,特别是在大约20个音节缩小到4之后。有没有人对如何将一系列整数转换成一个有些独特的易读词有任何想法? (有些副本没问题,但在大多数情况下,我希望每个数字组合都有一个独特的单词)
答案 0 :(得分:5)
我正在使用hashcode将int列表转换为一个16位int。然后通过假装它是一个基数n系统将该int转换为字符串,其中n是音节数,每个数字是一个音节。 (通过将int限制为16位,您可以减少音节数)。我不知道这是否有意义,但我希望输出能满足您的要求。
import java.util.Arrays;
import java.util.List;
public class NameGenerator {
final static List<String> syllables = Arrays.asList("ka", "sa", "ta", "na", "ha", "ma", "ya", "ra", "wa",
"ki", "si", "ti", "ni", "hi", "mi", "yi", "ri", "wi",
"ku", "su", "tu", "nu", "hu", "mu", "yu", "ru", "wu",
"ke", "se", "te", "ne", "he", "me", "ye", "re", "we",
"ko", "so", "to", "no", "ho", "mo", "yo", "ro", "wo");
final static int maxSyllable = syllables.size() - 1;
public static void main(String[] args) {
int[] attributes = new int[]{25, 325, 4, 2, 11, 98, 23};
String name = toName(attributes);
System.out.println("name = " + name);
}
public static String toName(int[] attributes) {
int hashCode = Arrays.hashCode(attributes);
int smallHashCode = (hashCode >> 16) ^ (hashCode & 0xffff);
return toName(smallHashCode);
}
public static String toName(int i) {
if (i < 0) {
i = -i;
}
StringBuilder buf = new StringBuilder();
while (i > maxSyllable) {
buf.append(syllables.get(i % maxSyllable));
i = i / maxSyllable;
}
buf.append(syllables.get(i));
return buf.toString();
}
}
答案 1 :(得分:3)
表示&#34;整数系列(列表)&#34;使用枚举和具有Bitset的生物属性集:
import java.util.BitSet;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class BitSetString {
private static Pattern regex = Pattern.compile("(\\d+)");
private static Prop[] props = Prop.values();
public static void main(String[] args) {
BitSet bs = new BitSet(47) {
@Override public String toString() {
Matcher m = regex.matcher(super.toString());
StringBuffer r = new StringBuffer();
while (m.find()) m.appendReplacement(r, props[Integer.parseInt(m.group())].toString());
m.appendTail(r);
return r.toString();
}
};
bs.set(Prop.ZED.ordinal());
bs.set(Prop.IFF.ordinal());
bs.set(Prop.WOW.ordinal());
bs.set(Prop.HEX.ordinal());
bs.set(Prop.ALT.ordinal());
bs.set(Prop.FOO.ordinal());
System.out.println(bs.toString()); // outputs '{FOO, WOW, IFF, ZED, HEX, ALT}'
}
private static enum Prop {
FOO, BAR, WOW, HEY, CAN, CAR, CUB, BIG, FAT, DRY, WET, EGO, MEH, EYE,
GOD, GUN, IFF, JOY, KEG, LOG, NIL, OHM, PIG, SAX, SKY, TIC, VIM, VOX,
YIN, ZED, HEX, HOG, GNU, ELF, CAB, BUS, ABS, ALT, ANY, CUE, DIF, FEZ,
}
}
好处:
答案 2 :(得分:0)
此解决方案基于Java 8 Stream API 如果整数序列中的每个数字低于音节数组长度,则该方法返回唯一字。
final static String[] syllables = new String[] {"ka", "sa", "ta", "na", "ha", "ma", "ya", "ra", "wa",
"ki", "si", "ti", "ni", "hi", "mi", "yi", "ri", "wi",
"ku", "su", "tu", "nu", "hu", "mu", "yu", "ru", "wu",
"ke", "se", "te", "ne", "he", "me", "ye", "re", "we",
"ko", "so", "to", "no", "ho", "mo", "yo", "ro", "wo"};
public static String listToString(List<Integer> list) {
return list.stream().map(num -> syllables[num % syllables.length])
.collect(Collectors.joining(""));
}