从 Java 中的数组列表中删除连续的重复项
Remove consecutive duplicates from an arraylist in Java
我有一个包含连续重复行的整数数组列表。
我要输出每一个和之前不一样的数
样本:1 3 3 3 2 2 1 2 2 3 3 3
期望输出:1 3 2 1 2 3
我应该怎么做?
我实际上是在为任何输入的文本文件创建一个倒排的单词索引。
我有一个 file/buffered reader 逐行读取多个文本文件并将每一行放入一个二维数组中,第一列是一个 .split 单词,第二列是该单词所在的文件名获得。然后我有一个 for 循环来获取特定单词在所有文件中出现的频率并将其添加到另一列。然后我将每一列复制到它们自己的数组列表中。我将单词 arraylist 添加到哈希集中以删除重复项。但我只想删除频率数组列表的连续重复项。
将元素相互比较的可能想法:
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;
}
以上逻辑是通过获取一个新列表并使 changes.But 下面的代码帮助您对同一列表进行更改。
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());
}
}
}
我在这里看到了两个答案,一个是使用额外的 space 另一个是使用额外的时间 (~n^2) 所以这是一个简单的反向迭代和删除,这将有助于删除 o( n) 不使用额外的时间 space:
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);
}
}
我有一个包含连续重复行的整数数组列表。 我要输出每一个和之前不一样的数
样本:1 3 3 3 2 2 1 2 2 3 3 3
期望输出:1 3 2 1 2 3
我应该怎么做?
我实际上是在为任何输入的文本文件创建一个倒排的单词索引。 我有一个 file/buffered reader 逐行读取多个文本文件并将每一行放入一个二维数组中,第一列是一个 .split 单词,第二列是该单词所在的文件名获得。然后我有一个 for 循环来获取特定单词在所有文件中出现的频率并将其添加到另一列。然后我将每一列复制到它们自己的数组列表中。我将单词 arraylist 添加到哈希集中以删除重复项。但我只想删除频率数组列表的连续重复项。
将元素相互比较的可能想法:
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;
}
以上逻辑是通过获取一个新列表并使 changes.But 下面的代码帮助您对同一列表进行更改。
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());
}
}
}
我在这里看到了两个答案,一个是使用额外的 space 另一个是使用额外的时间 (~n^2) 所以这是一个简单的反向迭代和删除,这将有助于删除 o( n) 不使用额外的时间 space:
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);
}
}