【问题标题】:Remove consecutive duplicates from an arraylist in Java从Java中的arraylist中删除连续的重复项
【发布时间】:2015-02-12 01:10:05
【问题描述】:

我有一个具有连续重复行的整数数组列表。 我想输出每一个和之前不一样的数字。

样本:1 3 3 3 2 2 1 2 2 3 3 3

所需输出:1 3 2 1 2 3

我应该怎么做?

我实际上是在为文本文件的任何输入创建单词的倒排索引。 我有一个文件/缓冲阅读器逐行读取多个文本文件,并将每一行放入一个二维数组中,第一列是 .split 单词,第二列是从中获取单词的文件名。然后我有一个 for 循环来获取特定单词在所有文件中出现的频率并将其添加到另一列。然后我将每一列复制到他们自己的数组列表中。我将单词 arraylist 添加到哈希集中以删除重复项。但我只想删除频率数组列表的连续重复项。

【问题讨论】:

  • 你已经写了什么?
  • 问题应该包括您迄今为止为解决问题所做的工作的总结,以及您在解决问题时遇到的困难的描述。请edit您的问题并包括您解决此问题的尝试。更多信息here

标签: java list integer duplicates


【解决方案1】:

比较元素的可能想法:

public static ArrayList<Integer> noConsecutiveDups(ArrayList<Integer> input) {

  ArrayList<Integer> newList = new ArrayList<Integer>();

  // Always add first value
  newList.add(input.get(0));

  // Iterate the remaining values
  for(int i = 1; i < input.size(); i++) {
    // Compare current value to previous
    if(input.get(i-1) != input.get(i)) {
       newList.add(input.get(i));
    }
  }

  return newList;
}

【讨论】:

  • 你是个奇迹创造者。我一直试图将 input.get(i) 与 input.get(i+1) 进行比较,但它一直超出范围。我没想到要添加一个,然后与以前的比较。
  • 哈哈!只是有创意。 :-)
【解决方案2】:

我在这里看到了两个答案,一个是使用额外的空间,另一个是使用额外的时间(~n^2)所以这里有一个简单的反向迭代和删除,这将有助于在 o(n) 时间内删除连续重复而不使用额外的空间:

import java.util.*;
public class HelloWorld{

     public static void main(String []args){
        ArrayList<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        list.add("a");
        System.out.println("Before:"+list);
        
        for(int i =list.size()-1;i>=1;i--){
            if(list.get(i).equals(list.get(i-1))){
                list.remove(i);
            }
        }
        System.out.println("After:"+list);
     }
}

【讨论】:

    【解决方案3】:

    上面的逻辑是获取一个新列表并进行更改。但是下面的代码可以帮助您对同一个列表进行更改。

    public class AvoidConsecutiveDups {
        public static void main(String args[]) {
            ArrayList<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("a");
            list.add("a");
            list.add("b");
            list.add("a");
            list.add("a");
            list.add("a");
    
            for (int i = 1; i <= list.size() - 1; i++) {
                if (list.get(i - 1) == list.get(i)) {
                    list.remove(i - 1);
                    for (int j = 1; j <= list.size() - 1; j++) {
                        if (list.get(j - 1) == list.get(j)) {
                            list.remove(j - 1);
                        }
                    }
                }
            }
    
            Iterator itr = list.iterator();
    
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }
        }
    }
    

    【讨论】:

    • 当一个简单的反向遍历和删除可以解决问题时,我不喜欢在另一个循环中包含一个循环的想法......
    猜你喜欢
    • 2018-05-29
    • 2011-01-26
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多