将整数列表转换为单词
Converting a list of ints to a word
我正在开发一个游戏,这个游戏有一个组件可以根据生物的属性为它指定一个特定的名称。具体来说,我有一组整数告诉我游戏中的生物拥有哪些属性,我需要根据这些特定属性制定一个名称。
我在想的是:为每个数字 1-47 分配一个音节(通过 Hashmap),这样根据动物具有的属性,字符串会有所不同。然而,一个明显的缺陷是字符串太长了。我写了一个算法,如果有超过 4 个音节,它基本上会组合音节。然而,这种方法会产生许多类似的结果,尤其是在将大约 20 个音节缩减为 4 个之后。有没有人对我如何将一系列整数变成一个有点独特的清晰单词有任何想法? (有些副本还可以,但在大多数情况下,我希望每个数字组合都有一个唯一的词)
我正在使用哈希码将整数列表转换为一个 16 位整数。然后将该 int 转换为一个字符串,假设它是一个以 n 为基数的数字系统,其中 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();
}
}
此解决方案基于 Java 8 流 API。
如果整数序列中的每个数字都小于音节数组的长度,则方法 return 唯一的单词。
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(""));
}
用枚举表示 "series (list) of integers",用 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,
}
}
好处:
- BitSet#toString() 为 a 生成唯一的单词字符串
生物属性的组合。
- 可预测的顺序由枚举定义,不管顺序是什么
属性被添加到生物。
- Bitset 提供方便的集合操作,并且比存储整数需要更少的内存。
我正在开发一个游戏,这个游戏有一个组件可以根据生物的属性为它指定一个特定的名称。具体来说,我有一组整数告诉我游戏中的生物拥有哪些属性,我需要根据这些特定属性制定一个名称。
我在想的是:为每个数字 1-47 分配一个音节(通过 Hashmap),这样根据动物具有的属性,字符串会有所不同。然而,一个明显的缺陷是字符串太长了。我写了一个算法,如果有超过 4 个音节,它基本上会组合音节。然而,这种方法会产生许多类似的结果,尤其是在将大约 20 个音节缩减为 4 个之后。有没有人对我如何将一系列整数变成一个有点独特的清晰单词有任何想法? (有些副本还可以,但在大多数情况下,我希望每个数字组合都有一个唯一的词)
我正在使用哈希码将整数列表转换为一个 16 位整数。然后将该 int 转换为一个字符串,假设它是一个以 n 为基数的数字系统,其中 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();
}
}
此解决方案基于 Java 8 流 API。
如果整数序列中的每个数字都小于音节数组的长度,则方法 return 唯一的单词。
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(""));
}
用枚举表示 "series (list) of integers",用 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,
}
}
好处:
- BitSet#toString() 为 a 生成唯一的单词字符串 生物属性的组合。
- 可预测的顺序由枚举定义,不管顺序是什么 属性被添加到生物。
- Bitset 提供方便的集合操作,并且比存储整数需要更少的内存。