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(整数;如果是字母数字则为字符串)

value = 逗号分隔的 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

值 = 字符串集(CNTCT_CDs

代码:

只需创建一个类来表示类似的记录

CNTCT_CD  EMP_ID 

1 2

public class Record {

    private String empId;
    private String cntctId;

//setters and getters
//constructors
}

通过创建记录列表来处理所有记录,如下所示: Set 用于消除重复的 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 回答