2017-02-14 68 views
0

可以說我有兩個列表,如:比較不等長度的兩個列表並刪除部分匹配?

List1 = Fulton Tax Commissioner 's Office, Grady Hospital, Fulton Health Department 

List2 = Atlanta Police Department, Fulton Tax Commissioner, Fulton Health Department,Grady Hospital 

我希望我的最終名單,看起來像這樣:

Final List = Fulton Tax Commissioner 's Office,Grady Hospital,Fulton Health Department,Atlanta Police Department 

我可以通過添加兩個列表的一組中刪除從這些清單中重複。但是,我如何去除像富爾頓稅務專員那樣的部分匹配?

+0

我已經看到了這個問題,我使用的是相同的例子以前 – Andremoniy

+0

@Andremoniy但背景不同。 – serendipity

+0

「部分匹配」是什麼意思? – Andremoniy

回答

1

我建議:對結果集列表1的副本列表2中的每個成員:

  • 如果結果包含相同的成員,請跳過它。
  • 如果結果中包含以列表2成員開頭的成員,那麼也跳過列表2成員
  • 如果結果包含的成員是列表2成員的前綴,請將其替換爲列表2成員
  • 否則將列表2成員添加到結果中。

如果使用Java 8,可以使用流方便地完成第2和第3項符號中的測試,例如result.stream().anyMatch(s -> s.startsWith(list2Member));

有優化的空間,例如使用TreeSet(如果可以對項目進行排序)。

編輯:在Java:

List<String> result = new ArrayList<>(list1); 
    for (String list2Member : list2) { 
     if (result.stream().anyMatch(s -> s.startsWith(list2Member))) { // includes case where list2Member is in result 
      // skip 
     } else { 
      OptionalInt resultIndex = IntStream.range(0, result.size()) 
        .filter(ix -> list2Member.startsWith(result.get(ix))) 
        .findAny(); 
      if (resultIndex.isPresent()) { 
       result.set(resultIndex.getAsInt(), list2Member); 
      } else { 
       result.add(list2Member); 
      } 
     } 
    } 

結果是:

[Fulton Tax Commissioner 's Office, Grady Hospital, Fulton Health Department, Atlanta Police Department] 

我相信這正是你要的結果。

進一步編輯:在Java 9,你可以使用(未​​測試):

  resultIndex.ifPresentOrElse(ix -> result.set(ix, list2Member),() -> result.add(list2Member)); 
1

添加通過傳遞一個比較,像下面設置:

Set s = new TreeSet(new Comparator() { 
    @Override 
    public int compare(Object o1, Object o2) { 
     // add the logic to say that partial match is considered same. 
    } 
}); 
s.addAll(yourList); 
+0

「我認爲部分匹配被認爲是相同的邏輯」是非常棘手的部分。 – Fildor

+0

現有的庫可以用來根據需要做到這一點,例如來自apace commons的StringUtils具有Levenshtein算法相關的方法,它們可以用來查找熟悉的字符串。 –

相關問題