Java:查找列表中的每个唯一单词并将其添加到新列表中

时间:2015-11-10 12:34:33

标签: java list for-loop

我试图创建一个方法来查找列表中的每个唯一单词,然后将它们添加到新列表中。我尝试过以下方法:

   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)

我该如何解决此错误?我的方法是否有效?

5 个答案:

答案 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]