0

[12、10、15、18] のような顧客 ID のリストがあります。それは、任意の順序で任意の他の番号にすることもできます。

オブジェクトのリスト (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=>マーク、10=>スコット、15=>パット、18=>ブライアン

私の解決策(ただし、最適化されていません)

以下の単純なアルゴリズムでそれを達成できることは知っていますが、より最適化されたソリューションを探しています(コンパレータで達成できますか?私はそうは思いませんが)

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);

}

ループの反復を保存できる最適化されたソリューション(提案されたソリューションに似ているか、まったく異なるもの)を探しています。別の解決策として、まず、キーを custObject[0]、値を custObject[1] としてハッシュマップを準備します。次に、注文したいリストでループを実行し、ハッシュマップから値を取得して、リンクされたハッシュマップに入れます。

4

3 に答える 3

1

まず、customerObjects からマップを作成します。

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]);
}

O(n^2) の代わりに overAll ~O(n)

于 2013-07-16T04:30:18.980 に答える
0
Map<String,ArrayList<String>> Map= new LinkedHashMap<String, ArrayList<String>>();

あなたの要件にそれを使用します。私は自分のアプリケーションでそれを使用していますが、正常に動作しています。

于 2013-07-16T04:25:03.797 に答える
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);
  }
于 2013-07-16T04:32:36.590 に答える