删除另一个数组中包含的id数组

时间:2016-01-26 15:42:03

标签: java arrays optimization guava rx-java

如果我有一个Track对象数组:

Track[] tracks;

每个轨道都有许多字段,其中包括String trackId:

public class Track{

    private String trackId;


    private String artistId;
}

然后我

String trackIdsToRemove[];

我想删除trackIdsToRemove []中列表轨道内对象中的ID。

除了迭代之外,还有什么奇特的方法可以做到这一点吗?也许和番石榴?还是RxJava?

5 个答案:

答案 0 :(得分:0)

无论你使用什么技巧/库,每次后端都是相同的,你需要找到要删除的元素,然后继续实际删除它。

但是你可以做一些小的优化,首先要采用最好的数据结构。如果你经常添加/删除曲目,也许你应该使用列表而不是数组。
然后,您还可以按顺序插入曲目,以便在需要找到要删除的曲目时进行二进制搜索。二进制搜索需要O(log(n))才能找到最差情况下的曲目,而普通搜索需要O(n)

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

答案 1 :(得分: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,以下是此线程的示例:

答案 2 :(得分:0)

如果您使用的是java 8和Guava:

tf.all_variables()

答案 3 :(得分:0)

我不确定你的意思"删除"从一个数组:你根本无法做到这一点,最好你可以设置为null单元格内容或以某种方式将其标记为无效/免费。

如果您的数组按ID排序,您可以二进制搜索您想要的ID"删除"为了获得更好的性能:假设N是集合的大小和删除集合的M,那么正常迭代是O(n * m),而通过二进制搜索,你得到O(log(n)* m)

一般来说,即使你有一个库,它也可以在场景后面用这些数据结构完成。

正如其他人所指出的,如果你需要支持删除,最好使用不同的结构:如果你有ID,它表明你的物品是唯一的,所以套装可能是理想的,否则列表应该做,或者地图对象 - > 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());

答案 4 :(得分:-1)

您无法从阵列中删除。您可以从列表中删除。将您的数组更改为列表并执行此操作:

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