使用标识符标记Arraylist <string>的不同值

时间:2016-10-26 15:38:03

标签: java arraylist distinct

我有一个简单的问题。我有一个ArrayList(String类型),名称为100&#39,000。我想创建另一个ArrayList(类型为Integer),它还有100个&#39; 000个元素,并为String ArrayList的每个元素分配一个ID-Number。等号应分配相同的ID号。
非常基本的例子:
我有:(汉斯,最大,汉斯,汉斯,坦白)
我想:(1,2,1,1,3)

我实施了一个可行的解决方案,但速度非常慢(对于我的100&#39,000名称的大数据集)。我想有人可以找到更好/更快的方法来做到这一点。谢谢大家的任何tipps!

public static void main(String[] args) {        

    // initialize arraylists
    ArrayList<String>  Names      = new ArrayList<String>();
    ArrayList<Integer> Id         = new ArrayList<Integer>();   

    // sample data              // I want the integer Arraylist to have values:
    Names.add("Hans");          // 1 
    Names.add("Max");           // 2
    Names.add("Hans");          // 1
    Names.add("Hans");          // 1
    Names.add("Frank");         // 3

    // my solution (works, but is slow and confusing)
    int N = Names.size();
    int ID_Count = 0;
    for (int i=0; i<N; i++) {
        boolean match_found = false;
        String curr_Name = Names.get(i);
        for (int check=0; check<i; check++) {
            if (curr_Name.equals(Names.get(check))) {
                Id.add(Id.get(check));
                match_found = true;
                break;
            }
        }
        if (match_found==false) {
            ID_Count++;
            Id.add(ID_Count);
        }
    }

    // show result
    for (int i=0; i<N; i++) {
        System.out.println(Id.get(i) + " " + Names.get(i));
    }
}

2 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你应该使用HashMap,因为它比使用两个数组更快/更容易。我会这样做:

Map<String,Integer> map = new HashMap<>();

通过这种方式,您可以执行map.put("name", int id),并且它不允许重复键(键是您的情况下的“名称”),因此您将自动只有一个键/值对用于名称是一样的。

答案 1 :(得分:0)

这是一种更快捷的方式:

    public static void main(String[] args) {

    // initialize arraylists
    ArrayList<String> Names      = new ArrayList<String>();
    Map<String,Integer> map      = new HashMap<>();

    // sample data              // I want the integer Arraylist to have values:
    Names.add("Hans");          // 1
    Names.add("Max");           // 2
    Names.add("Hans");          // 1
    Names.add("Hans");          // 1
    Names.add("Frank");         // 3

    int N = Names.size();

    int id = 0;
    for (int i = 0; i < N; i++) {
        String name = Names.get(i);
        if (map.get(name) == null) {
            map.put(name,++id);
        }
    }

    // show result
    for (int i=0; i<N; i++) {
        String name = Names.get(i);
        System.out.println(map.get(name) + " " +name);
    }

}