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

Chr*_*ael 11 java loops for-loop arraylist

我想在列表中添加一个字符串的字母,但我只想添加一次字母.例如,如果字符串是"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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Era*_*ran 14

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

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

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


Men*_*ena 13

为了防止集合中的重复,您不需要List,您需要Set(例如HashSet).

如果您想保留添加Strings 的订单,请使用LinkedHashSet.

最后,如果您希望Set自然地对您的Strings 进行排序(或者能够Comparator使用a 对它们进行排序),请使用a TreeSet.

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);
Run Code Online (Sandbox Code Playgroud)

产量

[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
Run Code Online (Sandbox Code Playgroud)