Java,比较两个列表的最佳方法是什么?

时间:2014-02-07 02:10:43

标签: android list comparison

我有两个默认和Chrome浏览器历史记录列表。 我想将这两个列表合并为一个列表。 我需要更新项目,如果我发现它重复(在两个列表之间是常见的)。

所以,我的“BrowserRecord”类是这样的:

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
...
}

最后,我有一个获取浏览器历史记录并进行合并的方法:

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条,我认为其他用户正在发生类似情况。但我肯定不是最佳方式。

你推荐什么? 任何建议将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确,但似乎您要尝试做的是,给定两个列表,创建一个最终列表,其中包含两个列表中的所有元素,删除任何重复项。

如果是这种情况,请查看Java的TreeSet类。如果您迭代两个列表中的所有元素并将它们插入TreeSet,您将基本上得到您正在寻找的结果。然后,您可以使用Iterator创建一个ArrayList,其中包含您列表中的所有非重复项。作为使用TreeSet的副作用,它们将被订购(如果您不关心订单,也可以使用HashSet;如果您想保留插入顺序,也可以使用LinkedHashSet )。