我想在列表中添加一个字符串的字母,但我只想添加一次字母.例如,如果字符串是"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)); } } }
但是这段代码不能避免重复.
使用a LinkedHashSet
来确定唯一字符会更有效.如果使用a LinkedHashSet
,则将保留输入String的唯一字符的顺序.
在单个循环之后,这将花费线性时间,您可以将所有唯一字符添加到输出中List
.
Setunique = new LinkedHashSet<>(); for (int i = 0; i < str.length(); i++){ unique.add(str.charAt(i)); } myList.addAll(unique);
为了防止集合中的重复,您不需要List
,您需要Set
(例如HashSet
).
如果您想保留添加String
s 的订单,请使用LinkedHashSet
.
最后,如果您希望Set
自然地对您的String
s 进行排序(或者能够Comparator
使用a 对它们进行排序),请使用a TreeSet
.
例
String foo = "ghghababcdef"; Sethash = new HashSet<>(); Set linked = new LinkedHashSet<>(); Set 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