【问题标题】:Looping through different arrays lists循环遍历不同的数组列表
【发布时间】:2016-12-22 07:01:50
【问题描述】:

我有三个不同大小的数组来收集节点状态,我想用一个循环遍历所有这些数组,而不是为每个循环创建一个。我已经看到将数组命名为整数并执行 while/for 循环和递增的示例,但我想找到一种方法来保留当前数组名称。这是我到目前为止所拥有的。

编辑:我想将所有列表分开,以便轻松区分哪些节点具有哪些状态..即

在线 - node1, node2 |离线 - node3, node4 |未知 - 节点 5、节点 6

private String nodeStatus() {

    List<Node> onlineNodes = new ArrayList<Node>();
    List<Node> offlineNodes = new ArrayList<Node>();
    List<Node> unknownNodes = new ArrayList<Node>();

    for(Node n : getNodes()){

        if (n.isRunning() == RunningType.ONLINE) {
            onlineNodes.add(n);
        }

        if (n.isRunning() == RunningType.OFFLINE) {
            offlineNodes.add(n);
        }

        if (n.isRunning() == RunningType.UNKNOWN) {
            unknownNodes.add(n);
        }
    }

    for (Node element : <online,offline,unknown>) {
        System.out.println(element);
    }

}

【问题讨论】:

  • 您没有数组,而是由数组支持的列表。为什么不在迭代之前将它们连接在一起?这是一个相当便宜的手术。否则,您需要在迭代最大列表时对边界进行一些无用的逻辑检查。
  • 为什么不保留第 4 个列表,即“全部”,并将每个节点添加到其中?
  • 对不起 - 我应该更清楚...我想让它们分开.. Online、Offline 和 Unknown 都会在它们自己的列表中,因此很容易区分哪些节点有哪个状态。这里没有显示的是节点状态大约每30秒更新一次
  • @Jon 所以当你迭代列表时,你需要知道迭代中的当前元素来自哪里?
  • Node.isRunning()的返回类型是什么?

标签: java arrays loops arraylist


【解决方案1】:

如果我理解正确,您想要的是使用第 4 个列表遍历 1 for-loop 上的 3 个列表,您可以实现此目的的方法是:

import java.util.*;

public class MultipleArraysLooping {
    public static void main (String args[]) {
        List <String> list1 = new ArrayList <String>();
        List <String> list2 = new ArrayList <String>();
        List <String> list3 = new ArrayList <String>();
        fillLists(list1, list2, list3);
        iterateLists(list1, list2, list3);
    }

    public static void fillLists(List <String> list1,
        List <String> list2, List <String> list3) {
        list1.add("item1 on list1");
        list1.add("item2 on list1");
        list1.add("item3 on list1");

        list2.add("item1 on list2");
        list2.add("item2 on list2");
        list2.add("item3 on list2");
        list2.add("item4 on list2");
        list2.add("item5 on list2");

        list3.add("item1 on list3");
        list3.add("item2 on list3");
    }

    public static void iterateLists(List <String> list1,
        List <String> list2, List <String> list3) {
        int size = 0;
        if (list1.size() > list2.size()) {
            if (list1.size() > list3.size()) {
                size = list1.size();
            } else {
                size = list3.size();
            }
        } else {
            if (list2.size() > list3.size()) {
                size = list2.size();
            } else {
                size = list3.size();
            }
        }

        for (int i = 0; i < size; i++) {
            if (i < list1.size()) {
                System.out.println(list1.get(i));
            }
            if (i < list2.size()) {
                System.out.println(list2.get(i));
            }
            if (i < list3.size()) {
                System.out.println(list3.get(i));
            }
        }
    }
}

以上代码给出的输出为:

item1 on list1
item1 on list2
item1 on list3
item2 on list1
item2 on list2
item2 on list3
item3 on list1
item3 on list2
item4 on list2
item5 on list2

如你所见,它交替迭代每个列表

我希望这会有所帮助,可能有更好的方法来获得最大的数组。

如果您想要按顺序迭代它们中的 3 个(列表 1 完成,然后是列表 2,最后是列表 3)或按某种状态,那么您需要在此处添加逻辑

【讨论】:

    【解决方案2】:

    您可能希望将状态映射到元素,而不是拥有 3 个单独的变量。假设你有 Java 8 并且 getNodes() 返回一个 Collection,你可以这样做:

    Map<String, List<Node>> elementsByStatus = getNodes().stream()
            .collect(Collectors.groupingBy(Node::isRunning));
    
    // print all elements
    elementsByStatus.stream()
            .flatMap(List::stream)
            .forEach(System.out::println);
    

    如果您需要按状态迭代元素,您可以这样做:

    elementsByStatus.forEach((status, elements) -> {
        elements.forEach(element -> {
            //...
        });
    });
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      public class ListIterator {
      
      public static void print(List<String> list){
      
          for (String string : list) {
              System.out.println(string);
          }
      }
      
      public static void main(String[] args) {
          List<String> list1=new ArrayList<>();
          List<String> list2=new ArrayList<>();
          List<String> list3=new ArrayList<>();
      
          list1.add("List11");
          list1.add("List12");
          list1.add("List14");
      
          print(list1);
      
          System.out.println();
          list2.add("List21");
          list2.add("List22");
          print(list2);
          System.out.println();
          list3.add("List3");
          print(list3);
          System.out.println();
      
      
      
      
      }
      }
      

      【讨论】:

        【解决方案4】:

        你也可以试试这个:

        public class ListIterator {
        
        public static void print(List<String> list){
        
            for (String string : list) {
                System.out.println(string);
            }
        }
        
        public static void main(String[] args) {
            List<String> list1=new ArrayList<>();
            List<String> list2=new ArrayList<>();
            List<String> list3=new ArrayList<>();
        
            list1.add("List11");
            list1.add("List12");
            list1.add("List13");
        
        
            list2.add("B1");
            list2.add("B2");
        
        
        
            list3.add("C1");
        
            int a=list1.size();
            int b=list2.size();
            int c=list3.size();
        
            int max=Math.max(a, b);
            max=Math.max(max, c);
        
            //System.out.println("");
        
            for(int i=0;i<max;i++){
        
        
               if (i<list1.size()) {
                   System.out.println(list1.get(i));
               }
               if (i<list2.size()) {
                   System.out.println(list2.get(i));
            }
        
               if (i<list3.size()) {
                   System.out.println(list3.get(i));
            }
        
            }
        
        
        
        
        
        }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-22
          • 2017-04-26
          • 1970-01-01
          • 1970-01-01
          • 2021-10-08
          • 1970-01-01
          • 2013-06-22
          相关资源
          最近更新 更多