2016-01-26 95 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()); 
相关问题