我有一个简单的问题。我有一个ArrayList(String类型),名称为100&#39,000。我想创建另一个ArrayList(类型为Integer),它还有100个' 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));
}
}
答案 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);
}
}