0

我正在使用 Java 开发一个个人项目,并且我正在尝试构建一个非常快速且没有重复的字符串。让我给你一个具体的例子:

String s = null;

for (char c : tableChars) {
     s += c;
}

好的,所以我知道我可以检查这个字符是否已经在字符串中,但是我必须在每次插入时查找它。还有其他方法吗?

4

6 回答 6

5

您可以尝试使用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]
于 2014-02-06T15:23:52.267 回答
1

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.

于 2014-02-06T15:25:30.687 回答
0

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

于 2014-02-06T15:25:00.930 回答
0

您可以先从 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
于 2014-02-06T15:28:14.910 回答
0

具有长度为 36 的 26 个字符 + 10 个数字(0-9)的字符数组。使用collections.shuffle

我希望有足够的排列来满足您的需要。

ps:其他选项可能有一个长的唯一字符串,手动旋转字符。真的取决于你需要生成多少个字符串。

于 2014-02-06T15:36:41.277 回答
0

您的要求是如此特殊,以至于我怀疑是否已经有一个功能可以满足您的需求。似乎在每次插入时寻找角色是唯一的方法,但我可以想到两种方法:

如果您的函数将处理相对较短的字符串,则您在每次插入时都会查找相似的字符,并查看您正在构建的字符串。

对于更长的字符串,您可以做一个与您的字符集一样大的数组。假设您有 50 个有效字符,那么您的数组大小为 50。

//initialize array to all zeros
for (char c : tableChars)
{
    if (array[c] == 0)
    {
        s += c;
        array[c] = 1;
    }
}

请注意,array[c] 只是伪代码,您需要对其进行调整以使用 ASCII 字符作为索引,或者围绕它构建一些自定义逻辑。

于 2014-02-06T15:32:20.727 回答