按照List中的值的顺序构造Map?

时间:2013-07-16 04:19:11

标签: java

我有一个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中。

3 个答案:

答案 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);
  }
相关问题