【问题标题】:how to arrange these values in a Java collection map如何在 Java 集合映射中排列这些值
【发布时间】:2017-04-28 12:30:50
【问题描述】:
        **My current code:

**我需要格式化它,因为重复的 Id 应该是映射中的键,并且值应该在数组列表中。 ** 它应该像一旦 id 改变它应该把 key 和 arraylis 放到 map 中一样工作,它应该启动 key 和 arraylist,初始化 arraylist 并继续循环执行

        public class Example1 {

        //main method
            public static void main(String args[]) {
                //Employee object initiated
                    /*Employee class contains the variables id and name and their getter setter method*/
                Employee e1 = new Employee();
                Employee e2 = new Employee();
                Employee e3 = new Employee();
                Employee e4 = new Employee();
                Employee e5 = new Employee();
                Employee e6 = new Employee();
                e1.setId("CG1");
                e1.setName("CL1");

                e2.setId("CG1");
                e2.setName("CL2");

                e3.setId("CG1");
                e3.setName("OTH");

                e4.setId("TST");
                e4.setName("AGY");

                e5.setId("TST");
                e5.setName("CAG");

                e6.setId("1.2");
                e6.setName("EQU");
                      /* Adding Employees to an ArrayList */ 
                List<Employee> liste = new ArrayList<Employee>();
                liste.add(e1);
                liste.add(e2);
                liste.add(e3);
                liste.add(e4);
                liste.add(e5);
                liste.add(e6);
                Map<String, ArrayList<String>> multimap = new HashMap<String, ArrayList<String>>();
                ArrayList<String> list = new ArrayList<String>();
                System.out.println("size of liste: " + liste.size());
                Employee[] et = new Employee[liste.size()];
                System.out.println("Employee arry size is: " + et.length);
                Iterator EmpArrayListItr = liste.iterator();
                for (int k = 0; k < et.length; k++) {
                    System.out.println("inside for loop");
                    et[k] = (Employee) EmpArrayListItr.next();
                    System.out.println("Employee Array contents: " + et[k].getId()
                            + "-" + et[k].getName());
                    System.out.println("object created");
                    if (k == 0) {
                        System.out.println("inside k==0 if");
                        String id = et[k].getId();
                        System.out.println("id inside k==0 if is: " + id);
                        list.add(et[k].getName());
                    }
                    if (k > 0) {
                        // et[k] = new Employee();
                        System.out.println("inside k>0 if");
                        String prevId = et[k - 1].getId();
                        System.out.println("previd: " + prevId);
                        if (et[k].getId().equals(prevId)) {
                            list.add(et[k].getName());
                        }
                    }
/*putting values into map*/
                    multimap.put(et[k].getId(), list);

                    System.out.println("value of k: " + k);

                }

                Set<Entry<String, ArrayList<String>>> entries = multimap.entrySet();

                for (Entry entry : entries) {
                    System.out.println(entry.getKey() + "/" + entry.getValue());

                }
            }
        }

   /* O/P currently I am getting:
    TST/[CL1, CL2, OTH, CAG]
    CG1/[CL1, CL2, OTH, CAG]
    1.2/[CL1, CL2, OTH, CAG]

   O/P expected:
    CG1/[CL1, CL2, OTH]
    TST/[AGY,CAG]
    1.2/[EQU] */

【问题讨论】:

    标签: java core


    【解决方案1】:

    既然可以让它变得复杂,为什么还要让它变得简单呢?

    首先去掉所有不必要的数组和数组列表。您需要的所有信息都已包含在名为 liste 的员工列表中。 第二点:不时打印一些细节可能会有所帮助,但不要打印所有内容。您可以改为调试代码。调试为您提供了非常详细的执行视图。

    您的代码可能如下所示:

        public class Example1 {
    
        public static void main(String args[]) {            
            Employee e1 = new Employee();
            Employee e2 = new Employee();
            Employee e3 = new Employee();
            Employee e4 = new Employee();
            Employee e5 = new Employee();
            Employee e6 = new Employee();
    
            e1.setId("CG1"); 
            e1.setName("CL1");
    
            e2.setId("CG1"); 
            e2.setName("CL2");
    
            e3.setId("CG1"); 
            e3.setName("OTH");
    
            e4.setId("TST"); 
            e4.setName("AGY");
    
            e5.setId("TST"); 
            e5.setName("CAG");
    
            e6.setId("1.2"); 
            e6.setName("EQU");
    
            List<Employee> liste = new ArrayList<>();
            liste.add(e1); 
            liste.add(e2); 
            liste.add(e3); 
            liste.add(e4); 
            liste.add(e5); 
            liste.add(e6);
    
            Map<String, ArrayList<String>> multimap = new HashMap<>();
    
            for(Employee emp : liste){
                // if id not yet in keyset put it as a new key and create a new list for the values 
               if(!multimap.keySet().contains(emp.getId())){
                  multimap.put(emp.getId(), new ArrayList<>());
                  // add the name to valueslist
                  multimap.get(emp.getId()).add(emp.getName());
               }
               // if id already exists you only need to add name to list
               else{
                   multimap.get(emp.getId()).add(emp.getName());
               }
            }
            for(Entry entry : multimap.entrySet()){
                System.out.println(entry.getKey() + "/" + entry.getValue());
            }
       }
    } 
    

    如果您在 Employee 类中使用构造函数,您仍然可以节省一些行,如下所示:

    public Employee(String id, String name) {
        this.id = id;
        this.name = name;
    }
    

    这使您的代码更短:

    public static void main(String args[]) {            
            Employee e1 = new Employee("CG1","CL1");
            Employee e2 = new Employee("CG1","CL2");
            Employee e3 = new Employee("CG1","OTH");
            Employee e4 = new Employee("TST","AGY");
            Employee e5 = new Employee("TST","CAG");
            Employee e6 = new Employee("1.2","EQU");             
            List<Employee> liste = new ArrayList<>();
            liste.add(e1); 
            liste.add(e2); 
            liste.add(e3); 
            liste.add(e4); 
            liste.add(e5); 
            liste.add(e6);
    
            Map<String, ArrayList<String>> multimap = new HashMap<>();
    
            for(Employee emp : liste){
               if(!multimap.keySet().contains(emp.getId())){
                  multimap.put(emp.getId(), new ArrayList<>());
                  multimap.get(emp.getId()).add(emp.getName());
               }
               else{
                   multimap.get(emp.getId()).add(emp.getName());
               }
            }
            for(Entry entry : multimap.entrySet()){
                System.out.println(entry.getKey() + "/" + entry.getValue());
            }
       }
    

    甚至更短,例如:

    public static void main(String args[]) {           
            List<Employee> liste = new ArrayList<>();
            liste.add(new Employee("CG1","CL1")); 
            liste.add(new Employee("CG1","CL2")); 
            liste.add(new Employee("CG1","OTH")); 
            liste.add(new Employee("TST","AGY")); 
            liste.add(new Employee("TST","CAG")); 
            liste.add(new Employee("1.2","EQU"));
    
            Map<String, ArrayList<String>> multimap = new HashMap<>();
    
            for(Employee emp : liste){
               if(!multimap.keySet().contains(emp.getId())){
                  multimap.put(emp.getId(), new ArrayList<>());
                  multimap.get(emp.getId()).add(emp.getName());
               }
               else{
                   multimap.get(emp.getId()).add(emp.getName());
               }
            }
            for(Entry entry : multimap.entrySet()){
                System.out.println(entry.getKey() + "/" + entry.getValue());
            }
       }
    

    【讨论】:

    • 这可以用像 Array[i][j] 这样的数组来实现,并且 O/P 将与 CG1/[CL1, CL2, OTH] TST/[AGY,CAG] 1.2/ 相同[EQU] */
    • 不清楚在哪里以及为什么要使用二维数组,但基本上可以用数组替换arrayList,反之亦然
    • 这里 CG1,TST 和 1.2 属于其他组,CL1,CL2,OTH,AGY,CAG 和 EQU 属于其他组并且这两个组相互关联。对于前国家-国家对。但是我必须使用 Array 来实现它,要么使用两个单独的数组,要么使用一个多个数组。
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2018-03-30
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多