我正在使用 Java 开发一个个人项目,并且我正在尝试构建一个非常快速且没有重复的字符串。让我给你一个具体的例子:
String s = null;
for (char c : tableChars) {
s += c;
}
好的,所以我知道我可以检查这个字符是否已经在字符串中,但是我必须在每次插入时查找它。还有其他方法吗?
您可以尝试使用Set
String str = "null";
char[] arr=str.toCharArray();
Set<String> set=new LinkedHashSet<>(); // LinkedHashSet keep the order
for(char i:arr){
set.add(String.valueOf(i)); // now you will have unique values
}
现在
System.out.println(set);
输出:
[n, u, l]
Any time you find yourself thinking "I want to check for duplicates in a very fast way", you should be using a HashSet
or some other Set
implementation.
Something like this:
Set<Character> charSet = new TreeSet<>();
charSet.add('a');
charSet.add('a');
charSet.add('b');
StringBuilder builder = new StringBuilder();
for (Character c : charSet) {
builder.append(c);
}
System.out.println(builder.toString());
The result is: ab
您可以先从 tableChars 中删除重复项:
public static void main(String[] args) {
char[] tableChars = {'G', 'o', 'o', 'd', 'l', 'u', 'c', 'k'};
Set<Character> charSet = new LinkedHashSet<Character>();
for (char c : tableChars){
charSet.add(c);
}
StringBuilder sb = new StringBuilder();
for (Character cr : charSet){
sb.append(cr);
}
System.out.println(sb.toString());
}
结果:
Godluck
具有长度为 36 的 26 个字符 + 10 个数字(0-9)的字符数组。使用collections.shuffle
我希望有足够的排列来满足您的需要。
ps:其他选项可能有一个长的唯一字符串,手动旋转字符。真的取决于你需要生成多少个字符串。
您的要求是如此特殊,以至于我怀疑是否已经有一个功能可以满足您的需求。似乎在每次插入时寻找角色是唯一的方法,但我可以想到两种方法:
如果您的函数将处理相对较短的字符串,则您在每次插入时都会查找相似的字符,并查看您正在构建的字符串。
对于更长的字符串,您可以做一个与您的字符集一样大的数组。假设您有 50 个有效字符,那么您的数组大小为 50。
//initialize array to all zeros
for (char c : tableChars)
{
if (array[c] == 0)
{
s += c;
array[c] = 1;
}
}
请注意,array[c] 只是伪代码,您需要对其进行调整以使用 ASCII 字符作为索引,或者围绕它构建一些自定义逻辑。