【问题标题】:Complicated array traversal and element removal [closed]复杂的数组遍历和元素删除
【发布时间】:2014-01-01 08:39:05
【问题描述】:

给定一个包含四个点的数组,生成一个具有相同点的新数组/向量/数组列表(无论哪个更简单),但如果存在具有重复 X 值的点,则只保存 Y 值最高的点。

例如:

如果给定 (3, 2), (3, 1), (1, 2), (1, 1),这个方法应该只输出 (3, 2) 和 (1, 2)。

如果给定 (3, 2), (3, 3), (3, 4), (3, 5),这个方法应该只输出 (3, 5)。

关于我应该如何进行此操作的任何想法?我的解决方案不断遇到 ConcurrentModificationException。

(for each point a in array) {
    (for each point b in newArray) {
        (if a and b have the same x and a has a greater y) {
            remove a 
            add b
        } else {
            add b
    }
}

【问题讨论】:

  • 请展示您的解决方案。如果同时更改列表/数组,则会出现该错误。循环时不能修改它。为了解决这个问题,将新点保存在一个新数组中,而不是尝试修改给定的点。
  • 我用一些伪代码编辑了我的帖子。

标签: java arrays


【解决方案1】:

简单的HashMap<Integer,Integer> 就可以了。只需检查ContainsKey() 并比较值,有条件地添加或不添加。

【讨论】:

  • 没有更简单的方法吗?我只处理最多 4 个点。
  • @GigaTocka 您的伪代码比仅使用哈希映射更复杂:P
【解决方案2】:

如果您的代码处于多线程环境中,请使用

ConcurrentHashMap<Integer, Integer>

并遍历每个元素并比较元素并将最高元素放在Map

【讨论】:

    【解决方案3】:
    put the first point in result list
    for each of the other three:
        if last X in result list not equal to this X:
            append point
        else if last Y < this Y:
            replace last point
    return result list
    

    我把javafication留给你

    【讨论】:

      【解决方案4】:

      通过 javadocs,您可能正在做类似的事情,修改一个 Collection 并同时由另一个线程对其进行迭代。

      ConcurrentModificationException的原因

      【讨论】:

        猜你喜欢
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 2019-11-08
        • 2012-01-13
        • 1970-01-01
        相关资源
        最近更新 更多