我有一个customerIds列表,如[12,10,15,18]。它也可以是任何其他数字,也可以是任何顺序。
我有对象列表(List customObjects),其中每个对象在0位置包含customerId 和客户名称在第1位置。
customObjects[0] ---> Object[0] contains 10 as customer id and scott as customer name
customObjects[1] ---> Object[0] contains 12 as customer id and Mark as customer name
customObjects[2] ---> Object[0] contains 18 as customer id and Brian as customer name
customObjects[3] ---> Object[0] contains 15 as customer id and Pat as customer name
现在我想构建一个地图,我按照customerIds列表的相同顺序获取值
预期结果Map [12 => Mark,10 => scott,15 => Pat,18 => Brian
我的解决方案(但未优化)
我知道我可以通过以下简单算法实现它,但我正在寻找更优化的解决方案。( 我们能用比较器实现吗?虽然我不这么认为)
public static void main(String[] args) {
List <Integer> custIds= Arrays.asList(12 , 10, 15, 18);
List <Object []> custObjects= new ArrayList<Object[]>();
Object [] custObject1 ={10,"Scott"};
Object [] custObject2 ={12,"Mark"};
Object [] custObject3 ={18,"Brian"};
Object [] custObject4 ={15,"Pat"};
custObjects.add(custObject1);
custObjects.add(custObject2);
custObjects.add(custObject3);
custObjects.add(custObject4);
Map custMap= new LinkedHashMap();
for(Integer custId : custIds){
for(Object [] custObject:custObjects){
if(custObject[0]==custId){
custMap.put(custObject[0], custObject[1]);
break;
}
}
}
System.out.println("map is"+custMap);
}
我正在寻找优化的解决方案(类似于我提出的解决方案或完全不同的东西),我可以保存循环迭代。另一个解决方案可以是,首先我使用key作为custObject [0]准备hashmap,将值作为custObject [1]准备。然后在我想要排序的列表上运行一个循环,从hashmap获取值并将其放在linkedhashmap中。
答案 0 :(得分:1)
首先从您的customerObjects构建一个Map:
Map<Integer,Object []> byId = new HashMap<>(customerData.size()); //set size in advance
//O(n) hashing (assumming good hashing and no resizing)
for (Object [] customerData : custObjects) {
byId.put(customerData[0],customerData);
}
然后你会有更快的查找,你可以通过id命令添加它们:
for(Integer custId : custIds){
Object [] custObject = byId.get(custId); //O(1) lookup
custMap.put(custObject[0], custObject[1]);
}
overAll~O(n)而不是你的O(n ^ 2)
答案 1 :(得分:0)
Map<String,ArrayList<String>> Map= new LinkedHashMap<String, ArrayList<String>>();
您可以根据自己的要求使用它。我在我的应用程序中使用它工作正常。
答案 2 :(得分:0)
您的解决方案是O(n * n)。如果先将custIds放入map中,然后将custObjects放入map中,它将为O(n)(假设LinkedHashMap找到的是O(1))
public static void main(String[] args) {
List<Integer> custIds = Arrays.asList(12, 10, 15, 18);
List<Object[]> custObjects = new ArrayList<Object[]>();
Object[] custObject1 = {10, "Scott"};
Object[] custObject2 = {12, "Mark"};
Object[] custObject3 = {18, "Brian"};
Object[] custObject4 = {15, "Pat"};
custObjects.add(custObject1);
custObjects.add(custObject2);
custObjects.add(custObject3);
custObjects.add(custObject4);
Map custMap = new LinkedHashMap();
for (Integer custId : custIds) {
custMap.put(custId, null);
}
for (Object[] custObject : custObjects) {
if (custMap.containsKey(custObject[0])) {
custMap.put(custObject[0], custObject[1]);
}
}
System.out.println("map is" + custMap);
}