【问题标题】:Generate unique sequence numbers java生成唯一的序列号java
【发布时间】:2017-09-27 09:32:46
【问题描述】:

我根据 Map 生成列表,

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

完整代码在这里:https://repl.it/L3cv/0

代码结果:

      list1: [account_number, account_number, account_number, account_number, Amount, Amount, Amount, Amount]
      list2: [1, 2, 3, 4, 100, 400, 500, 700]

期望的结果:(根据list2生成唯一的序列/id)

      list3: [1, 2, 3, 4, 1, 2, 3, 4]

在代码中,我尝试添加“sequence_number”,但它只是给出了增量值 [1,2,3,4,5,6,7,8]

        sequence_number = 0;
        for (final Integer val : value) {
            sequence_number++;
            list3.add(key);
            list4.add(val);
        }

但这并没有给我想要的结果。怎么做?

【问题讨论】:

    标签: java list collections


    【解决方案1】:

    我不是 100% 确定您要解决什么问题。这就是我认为你努力实现的目标。

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    class Main {
      public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<Integer>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        List<Integer> list2 = new ArrayList<Integer>();
        list2.add(100);
        list2.add(400);
        list2.add(500);
        list2.add(700);
    
        Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
        map.put ("account_number", list1);
        map.put ("Amount", list2);
    
        System.out.println(map);
    
        List<String> list3 = new ArrayList<String>();
        List<Integer> list4 = new ArrayList<Integer>();
    
        String lastkey = null;
        int sequence = 0;
        for (final Entry<String, List<Integer>> entry : map.entrySet()) {
            final String key = entry.getKey();
            final List<Integer> value = entry.getValue();
    
            for (final Integer val : value) {
                list3.add(key);
                if(lastkey == null||lastkey!=key){
                  sequence = 1;
                  lastkey = key;
                } 
                list4.add(sequence++);
            }
        }
    
        System.out.println(list3);
        System.out.println(list4);
      }
    }
    

    【讨论】:

      【解决方案2】:

      根据您对此问题的回答,有两种可能的解决方案:

      “第一个列表总是包含成对的项目吗?意思是,它总是有偶数个条目,所以如果有 12 个条目,你期望 1,2,3,4,5,6,1,2, 3,4,5,6?”

      如果是,您的解决方案如下:

       int halflist = list1.size() / 2;
       int sequencenumber = 0;
       for (...) {
          sequencenumber++;
          // add your stuff
          if (sequencenumber == halflist) sequencenumber = 0;
       }
      

      这将提高值 1,2,3,4,1,2,3,4。 它也可以用模数和更花哨的代码来完成,但这里的简单增量应该让它易于理解。

      • 如果不是,请提供更多详细信息,您想要达到的目标。

      【讨论】:

      • 感谢您的解决方案,这也很有帮助,但它添加了 0,例如 [2,3,4,0,2,3,4,0]
      • 不,我不这么认为。它从零开始,但在 for... 循环中作为第一行递增。所以第一个值是 1。for 循环的最后一行是 if... 语句,它重置为零(并再次作为下一次迭代的第一行递增)。你有上面确切的顺序吗?
      【解决方案3】:

      期望结果:(根据list2生成唯一序列/id)

      你的意思是list1?因为您给出的示例 - [1, 2, 3, 4, 1, 2, 3, 4] 属于 list1

      然后,如果你想重启超过list1大小的序列ID-Counter,你可以使用%-operator:

          for (final Entry<String, List<Integer>> entry : map.entrySet()) {
              final String key = entry.getKey();
              final List<Integer> value = entry.getValue();
              for (int i = 0; i < value.size(); i++) { //<<< We need an index.
                  list3.add(key);
                  list4.add(list1.get(i % list1.size()));  //<<< Change this!
              }
          }
      

      Your code-link, edited with changes.

      【讨论】:

        最近更新 更多