如何构造一个没有重复字符的String?

时间:2014-02-06 15:18:04

标签: java string construct

我正在使用Java开发个人项目,我正在尝试构建非常快速的字符串而不重复。让我举个具体的例子:

String s = null;

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

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

6 个答案:

答案 0 :(得分: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);

Out put:

   [n, u, l]

答案 1 :(得分:1)

每当您发现自己在想“我想以非常快的方式检查重复项”时,您应该使用HashSet或其他Set实施。

答案 2 :(得分:0)

这样的事情:

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());

结果是:ab

答案 3 :(得分: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

答案 4 :(得分:0)

您的要求非常特别,我怀疑已经制作了一个功能来做您想做的事情。看起来在每次插入时寻找角色是唯一的方法,但我可以想到两种方法:

如果你的函数将处理相对较短的字符串,你会在每次插入时查找一个类似的字符,查看你正在构建的字符串。

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

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

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

答案 5 :(得分:0)

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

足够的排列以满足您的需求我希望。

p.s:其他选项可能是一个长的唯一字符串,并手动只旋转字符。实际上取决于您需要生成多少个字符串。