【问题标题】:Unique Integers From Array List数组列表中的唯一整数
【发布时间】:2013-06-21 00:09:18
【问题描述】:

我在创建将返回数组列表的不同整数的方法时遇到问题。我真的很想删除重复项,然后只显示数组列表。我无法弄清楚是什么问题。当我测试它时,这是我得到的输出: [3, 11, 33, 10]

这是我的代码

package getUniques;

import java.util.ArrayList;

public class Uniques {

    public static ArrayList<Integer> getUniques( ArrayList<Integer> list ){
        int i = 0;
        while(i < list.size() - 1){

            for (int j = 0; j < list.size(); j++){

                if (list.get(i) == list.get(j))
                    list.remove(i);
            }
            i++;
        }

        return list;
    }

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(3);
        list.add(3);
        list.add(5);
        list.add(11);
        list.add(22);
        list.add(33);
        list.add(22);
        list.add(10);
        System.out.println(getUniques(list));
    }

}

【问题讨论】:

  • 要睡觉了,但是将int 值作为Integer 放在Set 中。然后检查int 是否在Set 中。如果是,请删除该值。最好使用for...next 循环(即Iterator

标签: java arraylist unique


【解决方案1】:

您还可以使用Set 获取唯一值。在Set 中插入值,然后将其放回ArrayList 中,例如new ArrayList(theSet);

【讨论】:

  • 这将删除订单。我不知道这是否可以接受。
  • @owlstead 那么您可以使用 sortedset。
  • 你也可以看LinkedHashSet维护广告顺序。
  • @tieTYT 仅当自然顺序与 List 中的顺序相同时
【解决方案2】:

在迭代时更改列表总是会导致痛苦! 假设您删除了第 3 项(因此旧的第 4 项变为新的第 3 项) - 然后您执行 i++,因此您实际上跳过了“旧的第 4 项”元素。

如果您删除了该项目以回到正轨,您可以跳过i++,但其他一些 解决方案:

  1. 首先使用 Set 或类似的东西,这样您就不会得到重复。

  2. 使用第二个列表来保存所需项目的值(或索引) 删除(如果使用索引,您可以从最高到最低删除它们 否则你最终会遇到同样的问题:删除索引 1,索引 4 现在是 索引 3...)

  3. 翻转你的搜索,让你回到 0,同样的原则 适用。您可以删除高索引而不影响低索引。

  4. 使您的外部循环使用迭代器,以便您可以使用删除操作。

【讨论】:

    【解决方案3】:

    您的代码存在一些问题。以下是对现有代码的修复:

    首先,您删除了错误的索引。您已将 j 处的元素标识为重复项;删除它而不是 i 处的元素。

    list.remove(j);  // j not i
    

    接下来,您将删除 所有 相同的元素,并且不会离开“原始”。要解决此问题,请仅测试(并删除)循环中超过 i 的那些。

    for (int j = i + 1; j < list.size(); j++){  // Start at i + 1, not 0.
    

    然后,您需要在删除 j 索引后重试它,因为其余元素已向后移动 1 个位置。而不是

    if (list.get(i) == list.get(j))
        list.remove(i);
    

    试试

    if (list.get(i) == list.get(j))
    {
        list.remove(j);
        j--;  // Try this j again next loop, once it's incremented again.
    }
    

    【讨论】:

      【解决方案4】:

      要在迭代时删除项目,您必须使用迭代器,因为它可以保证顺序:

      Iterator<Integer> iterator = list.iterator();
      int i = 0;
      List<Integer> listCopy = new ArrayList<Integer>(list);
      while(iterator.hasNext()){
          i++;
          Integer value = iterator.next()
          for (int j = i; j < listCopy.size(); j++){
              if (value.equals(listCopy.get(j))) {
                  iterator.remove();
              }
          }
      }
      

      但是,在这种情况下,由于您需要对同一个列表进行两次迭代,因此这不是最佳解决方案。将所有内容放入排序的 Set 可能会更快,因为 Set 会自行删除重复项。

      【讨论】:

      • i++ 是复制/粘贴问题,抱歉。但iterator.remove() 只删除当前项目。
      • 这行不通...删除所有...并且您正在使用带有整数的==.. -1 直到修复
      • 你说得对,我编辑了一些功能性的东西,直到我想出更好的东西。
      • 最后我的目的是展示如何使用迭代器进行删除,但这并不是针对这种特定情况的最佳解决方案,因为它会在同一个列表中迭代两次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多