我试图创建一个方法来查找列表中的每个唯一单词,然后将它们添加到新列表中。我尝试过以下方法:
public static void countWords(){
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
String inText = JOptionPane.showInputDialog(null, "Type in text");
int start = 0;
for(int i = 0; i < inText.length(); i++) {
if(inText.charAt(i) == ' ') {
list1.add(inText.substring(start,i));
start = i;
}
}
for(int a = 0; a < list1.size(); a++) {
for(int j = 0; j < a; j++) {
if(list1.get(a) != list2.get(j)) {
list2.add(list2.get(a));
}
}
}
}
当我运行程序并输入&#34; hi hi hi&#34;我收到这个错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at RäknaOrd.countWords(RäknaOrd.java:24)
at RäknaOrd.main(RäknaOrd.java:6)
我该如何解决此错误?我的方法是否有效?
答案 0 :(得分:5)
Java 8有一个很好的基于流的方法来返回一个删除了重复项的新列表:
List<String> list2 = list1.stream().distinct().collect(Collectors.toList());
同样要拆分String
并获得List<String>
,您可以避免像这样的for循环:
List<String> list1 = Arrays.asList(inText.split(" "));
但请记住,list1
在这种情况下是不可变的。
示范的最小例子是:
String inText = "hi hi hi";
List<String> list1 = Arrays.asList(inText.split(" "));
List<String> list2 = list1.stream().distinct().collect(Collectors.toList());
System.out.println(list2);
打印[hi]
答案 1 :(得分:1)
您的问题在if(list1.get(a) != list2.get(j))
list2
为空,您正试图通过list2.get(j)
所以改为写!list2.contains(list1.get(a))
for(int a = 0; a < list1.size(); a++) {
for(int j = 0; j < a; j++) {
if(!list2.contains(list1.get(a))) {
list2.add(list1.get(a));
}
}
}
答案 2 :(得分:1)
使用Set
检测双打效率更高。 Set
不允许存在同一对象的多个副本。此外,Set
可以在log(n)时间内检测项目是否已经包含在集合中(即,它不必迭代集合中的所有n个元素)。
<强>代码:强>
public static List<String> unique(List<String> list) {
Set<String> unique = new HashSet<String>();
for(String word : list)
unique.add(word);
return new ArrayList<String>(unique);
}
public static void main(String[] args) {
List<String> test=new ArrayList<String>();
test.add("hi");
test.add("test");
test.add("hi");
System.out.println(unique(test));
}
<强>输出:强>
[test, hi]
答案 3 :(得分:1)
我相信使用Stream可能是一个很好的解决方案:
list2=list1.stream().distinct().collect(Collectors.toList())
答案 4 :(得分:1)
{
String paragraph = "I felt happy because I saw the others were happy.";
String words[]=paragraph.split("\\W+");
List<String> list2 = new ArrayList<String>();
List<String> list1 = new ArrayList<String>();
for(int i=0;i<words.length;i++)
{
if(list2.contains(words[i])==false)
{
list2.add(words[i]);
}
else {
list1.add(words[i]);
}
}
list2.removeAll(list1);
Collections.sort(list2);
System.out.print(list2);
}
输出:
[because, felt, others, saw, the, were]