2015-10-19 73 views
2

我有一個類型爲SearchList的Arraylist list1,它是我的pojo類。我想查找列表1中出現的相似行數及其頻率.. 我該如何實現這一目標?如何計算Arraylist中的相似行

我的代碼:

List<SearchList> list1= new ArrayList<SearchList>();; 
SearchList sList = new SearchList(); 
for (int k = 0; k < list.size(); k++) { 
     sList.setArea(list.get(k).getArea()); 
     sList.setLocation(list.get(k).getLocation()); 
     list1.add(sList);  
} 

我已經這樣做了計數頻率,但不執行:

Set<SearchList> uniqueSet = new HashSet<SearchList>(list1); 
    for (SearchList temp : uniqueSet) { 
      System.out.println(temp + ": " + Collections.frequency(list1, temp)); 
    } 
+0

我能看到的主要問題是您要添加的同一個實例'SearchList'到'list1'多次(你應該每次添加一個新的實例)。 ''不執行'是什麼意思? –

+0

你的SearchList有hashCode並且等於overriden? –

+0

你會得到什麼錯誤? – markus

回答

0
List<SearchList> list1= new ArrayList<SearchList>(); //list1 is empty 

list1是空的,所以在代碼中的for循環:

for (SearchList temp : uniqueSet) { 
      System.out.println(temp + ": " + Collections.frequency(list1, 
temp)); 
     } 

would不執行(uniqueSet必須擁有的至少一種元素要執行的循環代碼)作爲集也將是空的:

Set<SearchList> uniqueSet = new HashSet<SearchList>(list1); // set is empty 
+0

但列表1不爲空 –

+0

「列表」的大小是多少? – dsharew

+0

列表的大小是動態的..但它不是空的 –

0
嘗試

上SearchList實現equals()方法中,由於Collections.frequency()調用此方法,並確保「uniqueSet」不爲空。

0

,你應該做到以下幾點:

  • 確保有您的全局定義列表條目(其名稱更改爲少誤導性的東西BTW)
  • 確保您添加SearchList的新實例您列表1。目前,您正在將相同的SearchList對象反覆添加到您的list1中。因此,如果你在你的sList對象上調用setArea或setLocation,你所有的lsit條目都會改變它們的值。列表條目只是指向內存中真實對象的引用。
  • 請確保您爲SearchList類提供正確的equals()和hashcode()實現。 檢查此鏈接上equals()和hashCode()方法:Why do I need to override the equals and hashCode methods in Java?
0

如果你想同時基於Java 8Streams位置值則價值distinct行,它就是這麼簡單:

int countSimilar = (int) searchListList.stream().distinct().count(); 

或者,如果行的清晰度取決於區域唯一的價值:

int countSimilarByArea = searchListList 
       .stream() 
       .collect(
         Collectors.toCollection(() -> new TreeSet<SearchList>((
           p1, p2) -> p1.getArea().compareTo(p2.getArea())))) 
       .size(); 

或者,如果行的清晰度取決於位置唯一的價值:

int countSimilarByLocation = searchListList 
       .stream() 
       .collect(
         Collectors.toCollection(() -> new TreeSet<SearchList>((
           p1, p2) -> p1.getLocation().compareTo(
           p2.getLocation())))).size(); 

用法:

import java.util.ArrayList; 
import java.util.List; 
import java.util.TreeSet; 
import java.util.stream.Collectors; 

final class SearchList { 
    private final String area; 
    private final String location; 

    public SearchList(String area, String location) { 
     this.area = area; 
     this.location = location; 
    } 

    public String getArea() { 
     return area; 
    } 

    @Override 
    public String toString() { 
     return "SearchList [area=" + area + ", location=" + location + "]"; 
    } 

    public String getLocation() { 
     return location; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((area == null) ? 0 : area.hashCode()); 
     result = prime * result 
       + ((location == null) ? 0 : location.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     SearchList other = (SearchList) obj; 
     if (area == null) { 
      if (other.area != null) 
       return false; 
     } else if (!area.equals(other.area)) 
      return false; 
     if (location == null) { 
      if (other.location != null) 
       return false; 
     } else if (!location.equals(other.location)) 
      return false; 
     return true; 
    } 

} 

public class CountSimilar { 
    public static void main(String[] args) { 
     List<SearchList> searchListList = new ArrayList<>(); 
     searchListList.add(new SearchList("A", "India")); 
     searchListList.add(new SearchList("B", "India")); 
     searchListList.add(new SearchList("A", "India")); 
     searchListList.add(new SearchList("A", "USA")); 
     searchListList.add(new SearchList("A", "USA")); 

     int countSimilar = (int) searchListList.stream().distinct().count(); 

     System.out.println(countSimilar); 

     int countSimilarByArea = searchListList 
       .stream() 
       .collect(
         Collectors.toCollection(() -> new TreeSet<SearchList>((
           p1, p2) -> p1.getArea().compareTo(p2.getArea())))) 
       .size(); 
     System.out.println(countSimilarByArea); 

     int countSimilarByLocation = searchListList 
       .stream() 
       .collect(
         Collectors.toCollection(() -> new TreeSet<SearchList>((
           p1, p2) -> p1.getLocation().compareTo(
           p2.getLocation())))).size(); 

     System.out.println(countSimilarByLocation); 
    } 
} 
+0

獲取錯誤:「方法main不能聲明爲靜態;靜態方法只能在靜態或頂級類型中聲明」 –

+0

看看http://stackoverflow.com/questions/22787063/the-method-main-不能待宣佈靜態靜態的方法,可以只待宣佈 – Arpit