我有两个默认和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条,我认为其他用户正在发生类似情况。但我肯定不是最佳方式。
你推荐什么? 任何建议将不胜感激。感谢。
答案 0 :(得分:0)
我不确定我是否理解正确,但似乎您要尝试做的是,给定两个列表,创建一个最终列表,其中包含两个列表中的所有元素,删除任何重复项。
如果是这种情况,请查看Java的TreeSet类。如果您迭代两个列表中的所有元素并将它们插入TreeSet
,您将基本上得到您正在寻找的结果。然后,您可以使用Iterator
创建一个ArrayList
,其中包含您列表中的所有非重复项。作为使用TreeSet的副作用,它们将被订购(如果您不关心订单,也可以使用HashSet;如果您想保留插入顺序,也可以使用LinkedHashSet )。