1

2 つの要素 (列) 演算子と id を含む sql クエリからの行を含む 2 つのリストがあります。演算子をリストの両方にマップし、両方のリストの id を出力したい (id は、両方のリストの演算子に対応して異なります)

この状況では、operator をキーにすることはできません。

    **List 1**            **Lists 2**
  operator1, id1       operator4, id7
  operator1, id2       operator3, id8
  operator2, id3       operator2, id9
  operator2, id4       operator2, id10
  operator3, id5       operator1, id11
  operator4, id6       operator1, id12

最終出力は次のようになります

    **List3**
operator1, id1,id2,id11,id12
operator2, id3,id4,id9,id11
operator3, id5,id8
operator4, id6,id7

どのような方法で実装できますか?

4

3 に答える 3

1

最も簡単な方法は、マップを使用して演算子でグループ化することです。実際には、リストの代わりにマップを使用できますが、マップを反復処理してキーと値を追加し、それらをリストに挿入することもできます。次のコードを使用して、必要な結果を得ることができます。

public static void main(String[] args) {
    List<Object> list1 = new ArrayList<Object>();
    list1.add("operator1, id1");
    list1.add("operator1, id2");
    list1.add("operator2, id3");
    list1.add("operator2, id4");
    list1.add("operator3, id5");
    list1.add("operator4, id6");

    List<Object> list2 = new ArrayList<Object>();
    list2.add("operator4, id7");
    list2.add("operator3, id8");
    list2.add("operator2, id9");
    list2.add("operator2, id10");
    list2.add("operator1, id11");
    list2.add("operator1, id12");

    Map<String, String> map = new HashMap<String, String>();
    List<Object> list3 = new ArrayList<Object>();

    Iterator<Object> it1 = list1.iterator();
    Iterator<Object> it2 = list2.iterator();

    while (it1.hasNext() && it2.hasNext()) {
        String[] line1 = ((String) it1.next()).split(",");
        map.put(line1[0], map.get(line1[0]) == null ? line1[1] : map.get(line1[0]) + ", " + line1[1]);

        String[] line2 = ((String) it2.next()).split(",");
        map.put(line2[0], map.get(line2[0]) == null ? line2[1] : map.get(line2[0]) + ", " + line2[1]);
    }

    for (Map.Entry<String, String> entry : map.entrySet()) {
        String item = entry.getKey() + "," + entry.getValue();
        System.out.println(item);
        list3.add(item);
    }
}

上記のコードを実行すると、結果は次のようになります。

operator4, id6,  id7
operator1, id1,  id2,  id11,  id12
operator3, id5,  id8
operator2, id3,  id4,  id9,  id10
于 2012-12-19T09:01:59.230 に答える
1

List3 の代わりに、ターゲット ソースとしてマップを作成します。マップにはキーとして演算子があり、値としてカンマ区切りの ID があります。

  • それを繰り返してリストの内容を読み取ります。
  • コンマを区切り文字としてコンテンツを分割します。
  • 演算子がマップに存在しない場合は追加し、そうでない場合は値を読み取り、ID を追加してマップに戻します。
  • 最終的には、必要なものを印刷するためにマップを反復するだけです。
于 2012-12-19T08:58:27.687 に答える
1

もう少しコンパクトでおそらく便利なアプローチ:

Map<String, List<String>> map = new HashMap<String, List<String>>();
for ( List<String> list : lists ) // List1 and List2 specifically
{
    for ( String s : list )
    {
        if ( map.get( getOperator( s ) ) == null ) 
        { 
            map.put( getOperator( s ) , new ArrayList<String>() ); 
        }
        map.get( getOperator( s ) ).add( getId( s );
    }
}

map.entrySet(); // will be a more useful version of your List3

メソッドgetOperator( String )getId( String )明らかなことを行います。

于 2012-12-19T09:13:22.920 に答える