如何将重复值合并到java中的单个记录中

时间:2013-05-24 20:30:14

标签: java

我有一个要求,我必须将重复值合并到单个记录中。例如

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 个答案:

答案 0 :(得分: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>");
}

答案 1 :(得分:0)

如果您的意思是使用数据结构,我想最好的选择是Hash Map,其中EMP_ID是关键。当您尝试插入元素并且已经存在具有该键的元素时,将其附加到现有元素

EDIT 假设您的对象是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);
    }
}

答案 2 :(得分:0)

也可以使用HashMap<String, Set<String>>

key = String EMP_ID

value =字符串集(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。 多数民众赞成!

答案 3 :(得分:0)

你不清楚你有什么问题,但我会试着猜测 假设我们有2个数组:cnctd_cdemp_id

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

你需要通过emp_id组合所有cntct_cd,这样我们就可以为员工找到他所有的cntct_cd(无论它意味着什么)。我建议遵循algoritm:

 //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 

有点伪代码:)