2016-01-26 94 views
0

ID數組如果我有跟蹤的對象數組:刪除包含在另一個陣列

Track[] tracks; 

如果每個軌道有很多領域等字符串的TrackID:

public class Track{ 

    private String trackId; 


    private String artistId; 
} 

然後,我有

String trackIdsToRemove[]; 

我想刪除位於列表軌道內的對象的trackIdsToRemove []中的id。

是否有任何奇特的方式來做到這一點,而不是迭代?也許用番石榴?還是RxJava?

+0

鑑於你的相關信息提供,沒有。如果主數組按trackId排序,則可以對它們進行二分搜索。另外,你不能從數組中真正地「移除」,至多你可以將單元格的內容設置爲null。 –

回答

0

如果您使用的是Java 8和番石榴:

Set<String> toRemove = Sets.newHashSet(trackIdsToRemove); 
tracks = Arrays.stream(tracks) 
    .filter(t -> !toRemove.contains(t.trackId)) 
    .toArray(Track[]::new); 
-1

您無法從陣列中刪除。您可以從列表中刪除。更改您的數組列表,而這種方式:

public void remove(String trackIdsToRemove[], List<Track> tracks) { 
    for(String str: trackIdsToRemove) { 
     tracks.remove(tracks.indexOf(str)); 
    } 
} 
+0

如果您確實需要按列表排序,那麼您可以將trackIdsToRemove列爲列表並執行removeAll。但請注意,trackToRemove是ID的集合,而不是Track對象的集合,因此您需要相應地調整代碼:因爲它現在不會編譯bc類型不兼容 –

+0

removeAll()的參數是列表的集合類型。事實並非如此。如果我將一個String數組傳遞給一個Track列表的removeAll(),它將不會刪除所有的曲目。請在投票前查詢您的答案。 – Paulo

+0

這就是我所說的:如果你有一個軌道集合,你可以使用remove或removeAll,但是你有一個字符串集合(id),所以你不能使用它們中的任何一個:你的indexOf方法在這裏會失敗正在向它傳遞一個字符串 –

0

不管你用什麼詭計/庫,後端將是相同的,每次,你需要找到要刪除的元素,然後進行實際刪除它。

但是你可以做一些小的優化,首先採取最好的數據結構。如果你打算添加/刪除曲目,也許你應該使用列表而不是數組。
然後,您還可以按照有序方式插入您的曲目,以便在需要找到要刪除的曲目時可以執行二分搜索。二進制搜索需要O(log(n))找到軌道在最壞的情況下,而正常的搜索需要O(n)

有用的鏈接:http://bigocheatsheet.com/#data-structures

0

您可以使用ArrayList:

ArrayList array = new ArrayList(); 
//add elements to array -> array.add(object1); 
ArrayList arrayToRemove = new ArrayList(); 
//add elements to array to remove -> array.add(object1); 
for(Object obj : arrayToRemove){ 
    array.remove(obj); 
} 

,如果你做到這一點,正在使用您自己的對象,您需要覆蓋下一個對象功能equalshashCode,以下是此主題的示例:

+0

值得一提的是,這種方法創建了一個數據副本:如果OP擔心性能可能是因爲集合很大,所以重複數據可能不可行。 –

+1

@DiegoMartinoia我認爲他可以改變對象。當然如果OP有一個原始數組,最好的辦法是自己做一次迭代,並用結果創建一個新副本。 – kunpapa

0

我不確定你從一個陣列「刪除」的意思:你根本無法做到這一點,充其量您可以將單元格內容設置爲空或以某種方式將其標記爲無效/免費。

如果您的數組按ID排序,您可以二進制搜索要「移除」的ID以獲得更好的性能:假設N是集合的大小和移除集合的M,則正常迭代是O(n * m),而通過二進制搜索你可以得到O(log(n)* m)

一般來說,即使你有一個庫,它也會完成這些與這些數據結構,只是幕後。

正如其他人指出的那樣,如果您需要支持刪除,最好使用不同的結構:假設您有ID,表明您的項目是唯一的,所以Set可能是理想的,否則List應該做,或者Map Obj - > Int來實現多套。

假如你可以改變你的代碼,使用更理想的結構,你可以不喜歡(Java8):

Set<Track> tracks; 
Set<String> idsToRemove; 
//Note: this has O(n*m) performance, though you could try using .parallelstream() instead of .stream() 
Set<Track> remainingOnes = tracks.stream().filter(x -> !idsToRemove.contains(x.id)).collect(Collectors.toSet()); 
相關問題