Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当值不同时,遍历数组列表并创建新的ArrayList,这是可能的吗?_Java_Arrays_Sorting_Arraylist - Fatal编程技术网

Java 当值不同时,遍历数组列表并创建新的ArrayList,这是可能的吗?

Java 当值不同时,遍历数组列表并创建新的ArrayList,这是可能的吗?,java,arrays,sorting,arraylist,Java,Arrays,Sorting,Arraylist,我对Java相当陌生,我偶然发现了一个我一生都无法解决的问题。首先让我解释一下我正在尝试做什么,然后我将向您展示到目前为止我拥有的代码 我有一个Web服务,它返回数组数组(包括公司和业务线字符串)。我希望将其转换为字符串列表,这是我在下面的第一行代码中所做的。然后,我希望遍历该列表,每当我遇到不同的公司价值时,我都希望创建一个新的ArrayList,并将相关的业务线添加到新列表中。webservice的示例输出:80,80,64,64(这是预先排序的,因此相同的公司将始终分组在一起)关联的LOB

我对Java相当陌生,我偶然发现了一个我一生都无法解决的问题。首先让我解释一下我正在尝试做什么,然后我将向您展示到目前为止我拥有的代码

我有一个Web服务,它返回数组数组(包括公司和业务线字符串)。我希望将其转换为字符串列表,这是我在下面的第一行代码中所做的。然后,我希望遍历该列表,每当我遇到不同的公司价值时,我都希望创建一个新的ArrayList,并将相关的业务线添加到新列表中。webservice的示例输出:80,80,64,64(这是预先排序的,因此相同的公司将始终分组在一起)关联的LOB将分别为1,2,3,4。我想要的:arraylist[0]:1,2 arraylist[1]:3,4

到目前为止,我所拥有的:

    List coList = Arrays.asList(coArray);
    //create list of lists
    List<List<String>> listOfLists = new ArrayList<List<String>>();
    String cmp = "";
    for (int i=0;i<coList.size();i++){//loop over coList and find diff in companies
        String currentCo = ((__LOBList)coList.get(i)).getCompany();
        String currentLob = ((__LOBList)coList.get(i)).getLobNum();
        if(i<coArray.length-1){
            String nextCo = ((__LOBList)coList.get(i+1)).getCompany();
            if((currentCo.equals(nextCo))){
                //do nothing companies are equal
            }else{
                log("NOT EQUAL"); //insert logic to create a new array??
                ArrayList<String> newList = new ArrayList<String>();
        //      for(int j=0;j<coList.size();j++){
                newList.add( ((__LOBList)coList.get(i)).getLobNum());                   
        //      }   


                for(int k=0; k<listOfLists.size();k++){//loop over all lists
                    for(int l=0;l<listOfLists.get(k).size();l++){ //get first list and loop through

                    }
                    listOfLists.add(newList);   
                }

            }
        }


    }
List coList=Arrays.asList(coArray);
//创建列表列表
List listOfLists=新建ArrayList();
字符串cmp=“”;

对于(int i=0;i我觉得更好的选择应该是列表映射。让公司ID作为映射中的键,并将该公司ID的每个新项附加到作为值的列表中

对作业使用正确的工具。数组的级别太低。

创建一个
Map


每次检索公司名称时,首先检查键是否已在映射中。如果已在映射中,则检索列表并向其添加
business
对象。如果未在映射中,则在空列表中插入新值并插入正在计算的值。

是的,您可以这样做,但用Java编写确实很烦人。注意:这是一个错误ead simple是一种函数式编程语言,如Clojure或Haskell。它只是一个名为
group by
的函数。在java中,我是这样做的:

  • 初始化列表的列表
  • 创建一个
    last
    指针,它是一个列表。它保存您添加到的最后一个列表
  • 迭代原始数据并填充到最后一个数据中,只要“没有任何更改”。如果有更改,请创建一个新的
    last
  • 我将演示如何:

    package com.sandbox;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Sandbox {
    
        public static void main(String[] args) {
            ArrayList<String> rawInput = new ArrayList<String>();
            rawInput.add("80");
            rawInput.add("80");
            rawInput.add("60");
            rawInput.add("60");
            new Sandbox().groupBy(rawInput);
        }
    
        public void groupBy(List<String> rawInput) {
            List<List<String>> output = new ArrayList<>();
            List<String> last = null;
    
            for (String field : rawInput) {
                if (last == null || !last.get(0).equals(field)) {
                    last = new ArrayList<String>();
                    last.add(field);
                    output.add(last);
                } else {
                    last.add(field);
                }
            }
    
            for (List<String> strings : output) {
                System.out.println(strings);
            }
        }
    }
    

    当然,你可以按照其他人的建议做,但这会改变你的数据类型。他们建议“适合工作的工具”,但他们没有提到番石榴。如果你决定将数据类型更改为地图,这会让你的生活更轻松

    下面是一个如何使用它的示例:

    公共类MutliMapTest{
    公共静态void main(字符串…参数){
    Multimap myMultimap=ArrayListMultimap.create();
    //添加一些键/值
    myMultimap.put(“水果”、“班纳纳”);
    myMultimap.put(“水果”、“苹果”);
    myMultimap.put(“水果”、“梨”);
    myMultimap.put(“蔬菜”、“胡萝卜”);
    //得到尺寸
    int size=myMultimap.size();
    System.out.println(大小);//4
    //获取价值
    收集水果=myMultimap.get(“水果”);
    System.out.println(水果);//[香蕉、苹果、梨]
    收集蔬菜=myMultimap.get(“蔬菜”);
    System.out.println(蔬菜);//[胡萝卜]
    //在整个Mutlimap上迭代
    for(字符串值:myMultimap.values()){
    系统输出打印项次(值);
    }
    //删除单个值
    myMultimap.移除(“水果”、“梨”);
    System.out.println(myMultimap.get(“水果”);/[Bannana,Pear]
    //删除键的所有值
    myMultimap.removeAll(“水果”);
    System.out.println(myMultimap.get(“水果”);//[](空集合!)
    }
    }
    
    尝试使用foreach而不是for

    就像

    foreach(在ListofList中列出第一组) foreach(第一组中的字符串s)
    谢谢大家的支持! 最后我列出了一系列清单:

    导入java.util.*

    导入search.LOBList; 公共类数组搜索{

    /**
     * @param args
     */
    public static void main(String[] args) {
        LOBList test = new LOBList();
        test.setCompany("80");
        test.setLOB("106");
    
        LOBList test1 = new LOBList();
        test1.setCompany("80");
        test1.setLOB("601");
    
        LOBList test2 = new LOBList();
        test2.setCompany("80");
        test2.setLOB("602");
    
        LOBList test3 = new LOBList();
        test3.setCompany("90");
        test3.setLOB("102");
    
        LOBList test4 = new LOBList();
        test4.setCompany("90");
        test4.setLOB("102");
    
        LOBList test5 = new LOBList();
        test5.setCompany("100");
        test5.setLOB("102");
    
        LOBList BREAK = new LOBList();
        BREAK.setCompany("BREAK");
        BREAK.setLOB("BREAK");
        BREAK.setcompany_lob("BREAK");
    
         // create arraylist       
          ArrayList<LOBList> arlst=new ArrayList<LOBList>();
          // populate the list
          arlst.add(0,test);
          arlst.add(1,test1);
          arlst.add(2,test2);
          arlst.add(3,test3);
          arlst.add(4,test4);
          arlst.add(5,test5);
    
             //declare variables
             int idx = 0;
             String nextVal = "";
             //loops through list returned from service, inserts 'BREAK' between different groups of companies
             for(idx=0;idx<arlst.size();idx++){
                  String current = arlst.get(idx).getCompany();          
                    if(idx != arlst.size()-1){
                        String next = arlst.get(idx+1).getCompany();
                        nextVal = next;
                        if(!(current.equals(next))){
                              arlst.add(idx+1,BREAK);   
                              idx++; 
                          }                                       
                    }                   
              }
            //add last break at end of arrayList 
              arlst.add(arlst.size(),BREAK);  
              for(int i=0;i<arlst.size();i++){
                  System.out.println("co:" + arlst.get(i).getCompany());
              }
              //master array list
              ArrayList<ArrayList<LOBList>> mymasterList=new ArrayList<ArrayList<LOBList>>();
              mymasterList = searchListCreateNewLists(arlst);
              //print log, prints all elements in all arrays
              for(int i=0;i<mymasterList.size();i++){
                  for(int j=0;j<mymasterList.get(i).size();j++){
                      System.out.println("search method: " + mymasterList.get(i).get(j).getCompany());                   
                  }
                  System.out.println("end of current list");
              }   
    }   
    //method to loop over company array, finds break, creates new array list for each company group, 
    //adds this to a list of lists(masterList) 
    public static ArrayList<ArrayList<LOBList>> searchListCreateNewLists(ArrayList<LOBList> list){      
          ArrayList<ArrayList<LOBList>> masterList=new ArrayList<ArrayList<LOBList>>();
          int end = 0;
          int start = 0;
          int index = 0;
          for(int i=0;i<list.size();i++){
              if(list.get(i).getCompany().equals("BREAK")){
                  end = i;//end is current index
                  masterList.add(new ArrayList<LOBList>());
                  for(int j = start;j<end;j++){
                       masterList.get(index).add(list.get(j));
                  }
                  index++;
                  start = i+1;
              }
    
          }
    
        return masterList;
    }
    
    /**
    *@param args
    */
    公共静态void main(字符串[]args){
    LOBList测试=新建LOBList();
    测试公司(“80”);
    test.setLOB(“106”);
    loblisttest1=新的LOBList();
    测试1.setCompany(“80”);
    test1.setLOB(“601”);
    loblisttest2=新的LOBList();
    测试2.setCompany(“80”);
    test2.setLOB(“602”);
    loblisttest3=新的LOBList();
    测试3.设定公司(“90”);
    test3.setLOB(“102”);
    loblisttest4=新的LOBList();
    测试4.setCompany(“90”);
    test4.setLOB(“102”);
    loblisttest5=新的LOBList();
    测试5.设定公司(“100”);
    test5.setLOB(“102”);
    LOBList BREAK=新的LOBList();
    BREAK.setCompany(“BREAK”);
    BREAK.setLOB(“BREAK”);
    BREAK.setcompany_lob(“BREAK”);
    //创建arraylist
    ArrayList arlst=新的ArrayList();
    //填充列表
    添加(0,测试);
    arlst.add(1,test1);
    arlst.add(2,test2);
    arlst.add(3,test3);
    arlst.add(4,test4);
    arlst.add(5,test5);
    //声明变量
    int-idx=0;
    字符串nextVal=“”;
    //循环浏览服务返回的列表,在不同的公司组之间插入“BREAK”
    
    用于(idx=0;idx遍历您可以使用的列表

      ListIterator litr = coList.listIterator();
      while(litr.hasNext()){
    
    
    
      }
    

    看起来这一行是你的罪魁祸首--newList.add(((((u)LOBList)coList.get(i)).getLobNum();我认为应该是newList.add((((u)LOBList)coList.get(i+1)).getLobNum();//请注意,我更新为i+1Awesome,感谢您的帮助!我甚至没有意识到存在多重映射,但这里有一个问题。如果我想将数据保存在类型u LOBList(它有几个字符串字段)中有没有办法用multimap做到这一点?我只是在想,如果我将公司作为关键,将业务线作为重点,我可能需要使用一些我将丢弃的信息values@Eric是的,
    Multimap.put
    接受
    。它可以是您想要的任何对象。@Eric我可能误解了。如果
    \uuuu LOBList
    是值列表(而不是值),您必须实现自己的
    多映射
    接口才能执行此操作
    /**
     * @param args
     */
    public static void main(String[] args) {
        LOBList test = new LOBList();
        test.setCompany("80");
        test.setLOB("106");
    
        LOBList test1 = new LOBList();
        test1.setCompany("80");
        test1.setLOB("601");
    
        LOBList test2 = new LOBList();
        test2.setCompany("80");
        test2.setLOB("602");
    
        LOBList test3 = new LOBList();
        test3.setCompany("90");
        test3.setLOB("102");
    
        LOBList test4 = new LOBList();
        test4.setCompany("90");
        test4.setLOB("102");
    
        LOBList test5 = new LOBList();
        test5.setCompany("100");
        test5.setLOB("102");
    
        LOBList BREAK = new LOBList();
        BREAK.setCompany("BREAK");
        BREAK.setLOB("BREAK");
        BREAK.setcompany_lob("BREAK");
    
         // create arraylist       
          ArrayList<LOBList> arlst=new ArrayList<LOBList>();
          // populate the list
          arlst.add(0,test);
          arlst.add(1,test1);
          arlst.add(2,test2);
          arlst.add(3,test3);
          arlst.add(4,test4);
          arlst.add(5,test5);
    
             //declare variables
             int idx = 0;
             String nextVal = "";
             //loops through list returned from service, inserts 'BREAK' between different groups of companies
             for(idx=0;idx<arlst.size();idx++){
                  String current = arlst.get(idx).getCompany();          
                    if(idx != arlst.size()-1){
                        String next = arlst.get(idx+1).getCompany();
                        nextVal = next;
                        if(!(current.equals(next))){
                              arlst.add(idx+1,BREAK);   
                              idx++; 
                          }                                       
                    }                   
              }
            //add last break at end of arrayList 
              arlst.add(arlst.size(),BREAK);  
              for(int i=0;i<arlst.size();i++){
                  System.out.println("co:" + arlst.get(i).getCompany());
              }
              //master array list
              ArrayList<ArrayList<LOBList>> mymasterList=new ArrayList<ArrayList<LOBList>>();
              mymasterList = searchListCreateNewLists(arlst);
              //print log, prints all elements in all arrays
              for(int i=0;i<mymasterList.size();i++){
                  for(int j=0;j<mymasterList.get(i).size();j++){
                      System.out.println("search method: " + mymasterList.get(i).get(j).getCompany());                   
                  }
                  System.out.println("end of current list");
              }   
    }   
    //method to loop over company array, finds break, creates new array list for each company group, 
    //adds this to a list of lists(masterList) 
    public static ArrayList<ArrayList<LOBList>> searchListCreateNewLists(ArrayList<LOBList> list){      
          ArrayList<ArrayList<LOBList>> masterList=new ArrayList<ArrayList<LOBList>>();
          int end = 0;
          int start = 0;
          int index = 0;
          for(int i=0;i<list.size();i++){
              if(list.get(i).getCompany().equals("BREAK")){
                  end = i;//end is current index
                  masterList.add(new ArrayList<LOBList>());
                  for(int j = start;j<end;j++){
                       masterList.get(index).add(list.get(j));
                  }
                  index++;
                  start = i+1;
              }
    
          }
    
        return masterList;
    }
    
      ListIterator litr = coList.listIterator();
      while(litr.hasNext()){
    
    
    
      }