我想在列表中添加一个字符串的字母,但我只想添加一次字母。例如,如果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));
}
}
}
但是这段代码不能避免重复。
答案 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());
它可能效率较低,但它是一个可读的内衬,它显示了流的力量。