【问题标题】:Retrieve all value pairs from List<Integer>从 List<Integer> 中检索所有值对
【发布时间】:2011-10-09 00:41:35
【问题描述】:

例如,我有一个 List&lt;Integer&gt; 对象,其中包含以下内容:

3, 6, 5, 3, 3, 6

结果将是 3 和 6。如何创建一个函数来测试重复项,然后返回重复项的 1 个值(不是对,只是对中的一个)?可能出现的一个问题是,如果有四倍值:3, 4, 5, 3, 8, 3, 3 那么我想返回 3 和 3。我该如何完成呢?

【问题讨论】:

  • 输出顺序是否必须是稳定的,这意味着这些对的输出顺序与它们在输入中出现的顺序相同吗?特别是,根据您的示例输入发出[ 6, 3 ] 是否违反您的预期合同?
  • 不,它没有。它只需要以任意顺序显示 3 和 6。

标签: java string list


【解决方案1】:

我会通过列表计算每个实例的数量(将它们存储在地图中),然后从地图中创建一个新列表:

List<Integer> values = // the list of values you have
Map<Integer,Integer> counts = new HashMap<Integer,Integer>();

for(Integer value : values) {
    if(counts.containsKey(value)) {
        counts.put(value, counts.get(value)+1);
    } else {
        counts.put(value, 1);
    }
}

List<Integer> resultValues = new ArrayList<Integer>();
for(Integer value : counts.keySet()) {
    Integer valueCount = counts.get(value);
    for(int i=0; i<(valueCount/2); i++) { //add one instance for each 2
        resultValues.add(value);
    }
}
return resultValues;

这避免了首先对值进行排序的 O(nlogn) 行为,而是在 O(n) 中工作。

【讨论】:

    【解决方案2】:

    我认为@RHSeeger 的“地图”方式已经足够好了。在这里我只是建议另一种方式,只是为了“有趣”,以便您可以看看。它给出了一个稳定的结果:第一个完成的对首先出现:

    List<Integer> values = ....;
    List<Integer> result = new ArrayList<Integer>();
    Set<Integer> unpairedValues = new HashSet<Integer>();
    
    for (int i : values) {
      if (unpairedValues.contains(i)) {
        result.add(i);
        unpairedValues.remove(i);
      } else {
        unpairedValues.add(i);
      }
    }
    // result contains what u want
    

    【讨论】:

      【解决方案3】:

      伪代码中的一种可能方式:

      sortedList = sort (list)
      duplicates = empty list
      while (length (list) > 1)
      {
          if (list [0] == list [1] )
          {
               duplicates.append (list [0] )
               list.removeAt (0)
          }
          list.removeAt (0);
      }
      

      【讨论】:

        【解决方案4】:
        // ArrayList<Integer> list = {3, 6, 5, 3, 3, 6}
        Collections.sort(list);
        
        ArrayList<Integer> pairs = new ArrayList<Integer>();
        int last = Integer.MIN_VALUE;  // some value that will never appear in the list
        for (Integer cur : list) {
            if (last == cur) {
                pairs.add(cur);
                last = Integer.MIN_VALUE;  // some value that will never appear in the list
            } else {
                last = cur;
            }
        }
        System.out.println(Arrays.toString(pairs.toArray()));
        

        会输出

        [3, 6]
        

        ** 编辑 **

        稍微好一点的算法,修改给定的列表

        // ArrayList<Integer> list = {3, 6, 5, 3, 3, 6}
        Collections.sort(list);
        int index = 1, last;
        while (index < list.size()) {
            last = list.remove(index - 1);
            if (list.get(index - 1) == last) {
                index++;
            }
            if (index == list.size()) {
                list.remove(index - 1);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-07
          • 2020-04-15
          • 1970-01-01
          • 2014-06-11
          相关资源
          最近更新 更多