根据string的第一个char删除ArrayList中的重复条目

时间:2013-11-25 09:42:05

标签: java arraylist

我想从数组列表中删除一个字符串,其第一个字符与另一个字符串相同。

示例

List<String> collection = new ArrayList<String>();

collection.add("1 w a");
collection.add("2 r a");
collection.add("1 r b");
collection.add("2 r b");
collection.add("3 w a");

输出

collection = ["1 w a", "2 r a", "3 w a"]

我尝试使用hashsetlinkedhashset

6 个答案:

答案 0 :(得分:1)

ind 列表包含要删除的索引。

但上面评论的人是正确的,计算上,即 通过算法查看,您应该使用更好的数据结构 这里,而不是ArrayList。

import java.util.ArrayList;
import java.util.List;


public class Test005 {

    public static void main(String[] args) {
        List<String> collection = new ArrayList<String>();
        collection.add("1 w a");
        collection.add("2 r a");
        collection.add("1 r b");
        collection.add("2 r b");
        collection.add("3 w a");

        List<Integer> ind = new ArrayList<Integer>();

        for (int i=0; i<collection.size(); i++){
            for (int j=0; j<i; j++){
                if (collection.get(j).charAt(0) == collection.get(i).charAt(0)){
                    ind.add(i);
                    break;
                }
            }
        }

        for (int k=0; k<ind.size(); k++){
            collection.remove(ind.get(k).intValue());
        }

        for (int i=0; i<collection.size(); i++){
            System.out.println(collection.get(i));
        }
    }

}

答案 1 :(得分:1)

基本上你想要做的就是浏览列表,对于每个元素,浏览列表的其余部分并删除任何具有相同startign字符的内容。

示例实施:

List<String> deleteList = new ArrayList<String>();
for(int i = 0;i < collection.size();i ++){
    //If this is flagged for deletion continue
    if(deleteList.contains(collections.get(i)))continue; 
    for(int j = i + 1;j < collection.size();j ++){
        //If this is flagged for deletion continue
        if(deleteList.contains(collections.get(j)))continue;
        //If the chars are the same, add it to the list to be deleted
        if(collection.get(i).charAt(0) == collection.get(j).charAt(0)){
            deleteList.add(collection.get(j));
        }
    } 
}

collection.removeAll(deleteList);

答案 2 :(得分:1)

使用最少character的存储空间,您可以执行查找和删除重复操作:

List<Character> dups = new ArrayList<Character>();
        Iterator<String> itr = collection.iterator();
        while(itr.hasNext()) {
            String s = itr.next();
            char c = s.charAt(0);
            if(dups.contains(c)) {
                itr.remove();
                continue;
            }
            dups.add(c);
        }
        System.out.println(collection);

<强>输出:

[1 w a,2 r a,3 w a]

答案 3 :(得分:1)

使用仅TreeSet的{​​{1}}仅查看第一个字符。将所有元素插入集合中。

Comparator

答案 4 :(得分:0)

 List<String> collection = new ArrayList<String>();

    collection.add("1 w a");
    collection.add("2 r a");
    collection.add("1 r b");
    collection.add("2 r b");
    collection.add("3 w a");

    Set set = new HashSet();
    for(int i=0;i<collection.size();++i){
        String temp = collection.get(i);
        if(set.contains(temp.charAt(0))){
            collection.remove(temp);
            i--;
        }  else{
            set.add(temp.charAt(0));
        }
    }
    for(int i=0;i<collection.size();++i){
        System.out.println(collection.get(i));
    }

输出:

1 w a

2 r a

3 w a

答案 5 :(得分:0)

遍历给定List的每个元素,在临时集的帮助下,我们检查第一个元素是否在集合中。如果不是那么我们将其添加到最终列表中。如果已包含该内容,则跳过它。

import java.util.*;
public class Test {

public static void main(String[] args) {
    List<String> collection = new ArrayList<String>();

    collection.add("1 w a");
    collection.add("2 r a");
    collection.add("1 r b");
    collection.add("2 r b");
    collection.add("3 w a");
    System.out.println(removeDuplicates(collection));
}

private static List<String> removeDuplicates(List<String> collection) {

    HashSet<String> withoutDuplicates = new HashSet<String>();
    List<String> collection2 = new ArrayList<String>();
    for(String s : collection){
        String[]  temp = s.split(" ");

        if(!withoutDuplicates.contains(temp[0])){
            withoutDuplicates.add(temp[0]);
            collection2.add(s);
        }
    }
    return collection2;
}
}