我有一個物件類
class Device{
String name;
String type;
String status;
}
我有 2 個串列 第一個就像
{d1,m1,active}, {d2,m2,active},{d3,m3,acticve}
第二個{d2,m2,paused},{d4,m4,paused}
我希望我的最終名單像
{d1,m1,active},{d2,m2,paused},{d3,m3,active},{d4,m4,paused}
我的方法是制作一個 commonName 串列,{d2}
然后將兩個串列都添加{d1,d2,d2,d3,d4}到一個總串列中,然后遍歷總串列,如果 common deviceName( d2.contains(i.getName())) 匹配,則洗掉狀態為活動的那個(洗掉我的意思是制作另一個串列和不要添加“活動”物件)。
除了在迭代中使用 contains 之外,是否還有一種有效的方法來執行此操作。將復雜度降低到 o(N)。
uj5u.com熱心網友回復:
假設第一個串列中的設備具有唯一名稱,您可以在兩個串列中流式傳輸并收集以映射合并,只要在第二個串列中找到相同的名稱并選擇具有paused作為狀態的名稱。使用以下類作為示例的示例:
@ToString
@AllArgsConstructor
@Getter
static class Divice {
private String name;
private String type;
private String status;
}
和以下示例串列
List<Divice> list1 = new ArrayList<>();
list1.add(new Divice("d1", "m1", "active"));
list1.add(new Divice("d2", "m2", "active"));
list1.add(new Divice("d3", "m3", "active"));
List<Divice> list2 = new ArrayList<>();
list2.add(new Divice("d2", "m2", "paused"));
list2.add(new Divice("d4", "m4", "paused"));
然后做 :
List<Divice> merged = new ArrayList<>(
Stream.concat(list1.stream(),list2.stream())
.collect(Collectors.toMap(Divice::getName,
Function.identity(),
(i,j) -> "paused".equals(i.getStatus()) ? i : j,
LinkedHashMap::new)).values()
);
merged.forEach(System.out::println);
uj5u.com熱心網友回復:
如果這 2 個串列按名稱排序,則您可以執行類似合并的操作,而無需任何包含操作。我會寫代碼,python因為我已經有一段時間沒有用 java 撰寫了,如果你很難將它翻譯成 java,只需寫一個評論,我會重寫它:
merged = []
i = 0
j = 0
while i < len(lst1) and j < len(lst2):
if lst1[i] < lst2[j]:
merged.append(lst1[i])
i = 1
# if lst2[j] == lst1[i] you want to take the paused one (in lst2)
else:
merged.append(lst2[j])
j = 1
# Advance i and j so there will not be duplicates
while lst1[i] == merged[-1]:
i = 1
while lst2[j] == merged[-1]:
j = 1
# Only one of these loops will run
while i < len(lst1):
merged.append(lst1[i])
i = 1
while j < len(lst2):
merged.append(lst2[j])
j = 1
uj5u.com熱心網友回復:
我找不到讓 Java 為你解決它的自動化方法,所以我寫這段代碼是為了提高效率。
它的作用是使用 java.util.Set 以比 java.util.List 更快地找到元素,并實作 bean 物件的 hashcode 和 equals 以確定物件是否相等。
只需一次,您就可以找到重復的專案,檢查其狀態并在需要時覆寫它。如果您在兩個串列中都有活動專案,您可能需要在回圈內的 if 中再添加一項檢查。
這就是產生的結果。
專案{name='d1', type='m1', status='active'}
專案{name='d2', type='m2', status='paused'}
專案{name='d3', type='m3', status='active'}
專案{name='d4', type='m4', status='paused'}
public class MergeList {
public static void main(String[] args) {
List<Item> list1 = new ArrayList<>();
list1.add(new Item("d1", "m1", "active"));
list1.add(new Item("d2", "m2", "active"));
list1.add(new Item("d3", "m3", "active"));
List<Item> list2 = new ArrayList<>();
list2.add(new Item("d2", "m2", "paused"));
list2.add(new Item("d4", "m4", "paused"));
Set<Item> listResult = new HashSet<>();
listResult.addAll(list1);
for(Item i : list2) {
if (listResult.contains(i) && "active".equals(i.getStatus()))
continue;
listResult.remove(i);
listResult.add(i);
}
for(Item i : listResult)
System.out.println(i);
}
}
class Item {
private String name;
private String type;
private String status;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
return name.equals(item.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
public Item(String name, String type, String status) {
this.name = name;
this.type = type;
this.status = status;
}
//getter and setters
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490967.html
