0

重複した値を単一のレコードにマージする必要があるという要件があります。例えば

CNTCT_CD  EMP_ID 
1          2     
2          3
3          2
5          2
4          3

そして、私はそれをこの形式で望んでいます。

CNTCT_CD   EMP_ID
1,3,5       2
2,4         3

どうすればそれを行うことができ、どのコレクションがここで使用するのに適していますか. 私はこのフォーラムとJavaも初めてです

4

4 に答える 4

2

使用するHashMap<Integer, StringBuilder>

key = EMP_ID (整数。英数字の場合は文字列)

値 = コンマ区切りの CNTCT_CD 値

HashMap<Integer, StringBuilder> map = new HashMap<Integer, StringBuilder>();

//Assuming that you populate List<Integer> idList yourself

for (Integer id : idList)
{
   StringBuilder builder = null;
   if (map.containsKey(id))
   {
       builder = map.get(id);
       builder.append(",");
   }
   else
   {
      StringBuilder builder = new StringBuilder();
   }

   builder.append("<respective-value>");
}
于 2013-05-24T20:34:21.790 に答える
1

も使えますHashMap<String, Set<String>>

キー = 文字列EMP_ID

value = String( CNTCT_CDs)のセット

コード:

次のようなレコードを表すクラスを作成するだけです

CNTCT_CD  EMP_ID 

1 2

public class Record {

    private String empId;
    private String cntctId;

//setters and getters
//constructors
}

次のようにレコードのリストを作成して、すべてのレコードを処理します。セットは、重複する cntct ID を排除するために使用されます。

    List<Record> records = new ArrayList<>();
    records.add(new Record("1", "2"));
    records.add(new Record("2", "3"));
    records.add(new Record("3", "2"));
    records.add(new Record("5", "2"));
    records.add(new Record("4", "3"));

    Map<String, Set<String>> map = new HashMap<String, Set<String>>();

    //Storing records as per your desired format
    for (Record record : records) {
        //if its a new key, add key and value(in a Set)
        if (!map.keySet().contains(record.getEmpId())) {
            Set<String> cntctIds = new HashSet<String>();
            cntctIds.add(record.getCntctId());
            map.put(record.getEmpId(), cntctIds);
        //key already added, just add the value to the added Set
        } else {
            map.get(record.getEmpId()).add(record.getCntctId());
        }
    }

Integer上記の代わりに使用できますString。それでおしまい!

于 2013-05-24T20:40:03.930 に答える
0

あなたが何を持っているかを質問することからは明らかではありませんが、私は推測しようとします.
2 つの配列があるとします:cnctd_cdemp_id:

 int[] cntct_cd = {1, 2, 3, 5, 4};
 int[] emp_id = {2, 3, 2, 2, 3};

すべての cntct_cd を emp_id で結合する必要があるため、従業員のすべての cntct_cd (意味が何であれ) を見つけることができます。次のアルゴリズムをお勧めします。

 //define map that will contain list of cntct_cd by emp_id
 Map<Integer, List<Integer>> grouped = ...;
 // for each item in arrays do following:
     // check if grouped contains current emp_id
     // if not, put new empty list for current emp_id to grouped map.

     // get list from grouped by emp_id and add current cntct_cd to this list

 // At the end you'll get map of all cntct_cd combined by emp_id 

それは一種の擬似コードです:)

于 2013-05-24T20:48:39.447 に答える
0

使用するデータ構造を意味する場合、最適なオプションは EMP_ID がキーであるハッシュ マップだと思います。要素を挿入しようとして、そのキーを持つ要素が既に存在する場合は、既存の要素に追加します

編集オブジェクトがABCであると仮定すると、次のようになります。重複をどのようにグループ化するかによって異なります。

HashMap<String, Group of ABC> map = new HashMap<String, Group of ABC>();

void insert (ABC item){
    <Group of ABC> existing = map.get(item.EMP_ID);
    if (existing == null){
         G = new <Group of ABC>()
         map.put(ABC.EMP_ID, G);
    } else {
        existing.append(ABC); //Here comes to you how to merge 2 items of this kind (append strings, use a list...)
        map.put(item.EMP_ID, existing);
    }
}
于 2013-05-24T20:34:42.090 に答える