将给定String的唯一字母添加到List

时间:2015-12-16 14:30:39

标签: java loops for-loop arraylist

我想在列表中添加一个字符串的字母,但我只想添加一次字母。例如,如果String是" HELLO AM CHRISTOS WHITE",有些字母出现的次数超过一次,所以我希望它们只能添加一次。

我正在考虑两个for循环:

for (int i=0; i< str.length(); i++){
    for(int j=0; j< str.length(); j++){
        if (str.charAt(i) != str.charAt(j)) {
            myList.add(charAt(i));
        }
    }
}

但是这段代码不能避免重复。

5 个答案:

答案 0 :(得分:14)

使用LinkedHashSet来确定唯一字符会更有效。如果使用LinkedHashSet,则将保留输入字符串的唯一字符的顺序。

在单个循环之后,需要线性时间,您可以将所有唯一字符添加到输出List

Set<Character> unique = new LinkedHashSet<>();
for (int i = 0; i < str.length(); i++){
    unique.add(str.charAt(i));
}
myList.addAll(unique);

答案 1 :(得分:13)

为防止集合中出现重复项,您不需要List,需要Set(例如HashSet)。

如果您要保留添加String的订单,请使用LinkedHashSet

最后,如果您希望Set自然地对String进行排序(或者能够使用Comparator对其进行排序),请使用TreeSet。< / p>

示例

String foo = "ghghababcdef";
Set<String> hash = new HashSet<>();
Set<String> linked = new LinkedHashSet<>();
Set<String> tree = new TreeSet<>();
// iterating characters
for (char c: foo.toCharArray()) {
    // adding String representation of character to each set
    hash.add(Character.toString(c));
    linked.add(Character.toString(c));
    tree.add(Character.toString(c));
}
// printing...
System.out.println(hash);
System.out.println(linked);
System.out.println(tree);

<强>输出

[a, b, c, d, e, f, g, h] // this may vary
[g, h, a, b, c, d, e, f] // keeps insertion order
[a, b, c, d, e, f, g, h] // sorted lexicographically by default

答案 2 :(得分:4)

作为Set答案的替代方案,如果您想坚持List解决方案。 您只需循环一次并使用List.contains(Object)方法,并检查char中是否已存在当前List

String str = "HELLO AM CHRISTOS WHITE";
List<Character> myList = new ArrayList<>();
for(int i=0; i< str.length(); i++){
    if (!myList.contains(str.charAt(i))) {
        myList.add(str.charAt(i));
    }
}
for(char c : myList) {
    System.out.println(c);
}

输出

  

HELO AMCRISTW

答案 3 :(得分:0)

未分配

j。我猜它被初始化为0所以没有异常

如果您将第二个循环更改为for(int j=0; j< str.length(); j++)它仍然不起作用,它将不会打印任何字符串中重复的字母。

所以想想j需要迭代的范围。如果你得到我的jist,你想要打印字符串中尚未出现的任何字母。

答案 4 :(得分:0)

不幸的是,Java 8中没有字符流,但这是Java 8方式:

str.chars().distinct().mapToObj(c -> (char) c).collect(Collectors.toList());

它可能效率较低,但它是一个可读的内衬,它显示了流的力量。