【问题标题】:List substraction with indices使用索引列出减法
【发布时间】:2017-12-16 15:26:53
【问题描述】:

假设我有一个这样的列表 A:

line value
0    Object0
1    Object1
2    Object2
3    Object3
4    Object4
5    Object5

现在,我有另一个列表 B,其中包含 [0,2,3](仅 Integer),它基本上包含我已经查看过的对象的索引。

我想获得列表 C(它是索引 [0,1,2,3,4,5]-[0,2,3]=[1,4,5]):

line value
1    Object1
4    Object4
5    Object5

顺便说一句:我需要原始列表保持不变。

我可以创建索引列表,然后删除 B 列表以获取 C 列表,但有没有一种简单有效的方法可以直接获取对象?

【问题讨论】:

  • 对象是唯一的吗?如果是这样,您可以使用 HashSets
  • 是的,它们都是独一无二的
  • 使用 HashSet 和 List 不一样吗?因为我的第二个列表只包含索引(如整数)而不是实际的对象

标签: java list loops set-difference


【解决方案1】:

用流很容易解决,例如:

    List<Object> listC = IntStream.range(0, listA.size())
            .filter(n -> !listB.contains(n))
            .mapToObj(n -> listA.get(n))
            .collect(Collectors.toList());

listAlistB 保持原样

【讨论】:

    【解决方案2】:

    编辑:(因为我忘记了您不希望更改原始列表):
    所以 ONE-LINE 操作很有用:

    //I recreate your scenario to test
    List<Object> list = new ArrayList<>();
    list.add("Object0"); list.add("Object1"); list.add("Object2");
    list.add("Object3"); list.add("Object4"); list.add("Object5");
    List<Integer> indexesToAvoid = Arrays.asList(0, 2, 3);
    

    原理是这样的:遍历您的对象,并将索引未出现的对象保留在 indexesToAvoid 中,然后将它们收集到 new List 中:

    List<Object> resultList = list.stream()
            .filter(obj -> !indexesToAvoid .contains(list.indexOf(obj)))
            .collect(Collectors.toList());
    

    【讨论】:

    • 此解决方案具有二次性能,更准确地说,运行时间与 n*m 成正比,其中 n 是列表 A 的大小,m 是列表 B 的大小。对于小列表应该没问题,但可能是如果列表很大,就会出现问题。
    • 我们在 2017 年在 Go 中使用 ram 计数,在 Go 中也使用磁盘,不是这种操作会减慢任何速度^^
    • 正是由于内存数量大,问题可能会出现,CPU 速度和内存大小之间的比率实际上是相当恒定的。效率很重要,不能被一般的 cmets 忽视,比如“哦,这是 X 年”。此外,如果运行时间不重要,那么能源效率可能更重要。
    【解决方案3】:

    生成一组从 0 到列表排他大小的索引,然后从另一个列表中删除索引,然后通过从原始列表中的索引选择对象来填充结果列表。

    使用您的示例:

    1. 生成[0,1,2,3,4,5]集合
    2. 从集合中减去[0,2,3],得到[1,4,5]集合
    3. 对于[1, 4, 5] 中的每个索引,从源列表中获取对象并放入结果列表中

    或者创建原始列表的副本并从副本中删除具有[0,2,3] 索引的元素。

    您可能还想考虑更改包含[0,2,3] 索引的数据结构并以更一般的方式描述问题,而不假设必须使用[0,2,3] 索引列表,这可能会导致更优雅和有效的解决方案.

    【讨论】:

    • 是的,你是对的,我只是为了便于理解而使用了这些值。改变我的B List的数据结构是什么意思,还有什么更好的吗?
    • 例如,您可以自己保留一组对象而不是保留索引吗?
    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2021-09-10
    相关资源
    最近更新 更多