2014-02-07 2 views
0

기본 및 Chrome 브라우저 기록의 두 가지 목록이 있습니다. 이 두 목록을 하나의 목록으로 병합하고 싶습니다. 복제본을 찾으면 항목을 업데이트해야합니다 (두 목록간에 공통적입니다).자바, 두 목록을 비교하는 가장 좋은 방법은 무엇입니까?

public class BrowserRecord { 

private long id; 
    private int bookmark; 
    private long created; 
    private long date; 
    private String title; 
    private String url; 
    private long visits; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     BrowserRecord record = (BrowserRecord) o; 
     return url.equals(record.url); 
    } 

    @Override 
    public int hashCode() { 
     return url.hashCode(); 
    } 

// other getter setter methods 
... 
} 

그리고 마지막으로, 나는 브라우저의 역사를 얻을 수 및 병합 않는 방법이 있습니다 :

그래서, 내 "BrowserRecord"클래스는 다음과 같이이다

public List<BrowserRecord> getHistory() { 
     List<BrowserRecord> browserList = new ArrayList<BrowserRecord>(); 

     // get history of default and chrome browsers 
     List<BrowserRecord> defaultList = getDefaultBrowserHistory(); 
     List<BrowserRecord> chromeList = getChromeBrowserHistory(); 

     Log.e(TAG, "=> size of Default browser:" + defaultList.size()); 
     Log.e(TAG, "=> size of Chrome browser:" + chromeList.size()); 

     // compare list A with B, update A item if equal item found in B and push it to tempList 
     for(int i=0; i<chromeList.size(); i++) { 
      BrowserRecord chromeBrowser = chromeList.get(i); 

      for(int j=0; j<defaultList.size(); j++) { 
       BrowserRecord defaultBrowser = defaultList.get(j); 

       if(chromeBrowser.equals(defaultBrowser)) { 
        if(chromeBrowser.getBookmark() != defaultBrowser.getBookmark()) 
         chromeBrowser.setBookmark(1); 

        chromeBrowser.setVisits(chromeBrowser.getVisits() + defaultBrowser.getVisits()); 
       } 
      } 

      browserList.add(chromeBrowser); 
     } 

     // compare list B with A, jump if equal item found in A, push to tempList if item not found 
     for(int i=0; i<defaultList.size(); i++) { 
      BrowserRecord defaultBrowser = defaultList.get(i); 
      boolean found = false; 

      for(int j=0; j<chromeList.size(); j++) { 
       BrowserRecord chromeBrowser = chromeList.get(j); 

       if(defaultBrowser.equals(chromeBrowser)) { 
        found = true; 
        break; 
       } 
      } 

      if(!found) 
       browserList.add(defaultBrowser); 
     } 

     Log.e(TAG, "=> size of final browser:" + browserList.size()); 
     return browserList; 
    } 

나는이 방법을 테스트 한을 잘 작동합니다. 3 년 후의 모바일 장치에 대한 내 기록은 하나의 목록에서 200 개가 넘고 다른 목록에서는 150 개를 넘지 않았으므로 다른 사용자가 비슷한 일이 발생했다고 가정합니다. 그러나 나는 최적의 방법이 아니라고 확신합니다.

무엇이 좋습니다? 제안 사항을 보내 주시면 감사하겠습니다. 감사.

답변

0

정확히 이해하고 있는지 모르겠지만 두 목록에서 주어진 것처럼 두 목록의 요소를 모두 포함하는 최종 목록을 만들어 중복 된 항목을 제거하는 것입니다.

이 경우 자바의 TreeSet 클래스를 살펴보십시오. 두 목록의 모든 요소를 ​​반복하여 TreeSet에 삽입하면 기본적으로 원하는 결과를 얻을 수 있습니다. 그런 다음 Iterator을 사용하여 두 목록의 모든 중복되지 않은 항목을 모두 포함하는 ArrayList을 만들 수 있습니다. TreeSet을 사용하면 부작용이 발생합니다 (순서를 신경 쓰지 않는다면 HashSet을 사용할 수도 있고 삽입 순서를 유지하려면 LinkedHashSet을 사용할 수도 있습니다).

관련 문제