Java 汇总arraylist中的特定数据

Java 汇总arraylist中的特定数据,java,arraylist,Java,Arraylist,我正在寻找一种很好的方法,根据特定的条件总结我的ArrayList中的一些特定数据,但我无法使其按预期工作。My ArrayList包含以下数据序列域、IP、总数,例如: [gmail.com", "172.11.0.89", 1, gmail.com", "172.11.0.89", 60, "gmail.com", "192.168.0.66", 13] 我试图做的是循环遍历ArrayList并检索IP地址。之后,我将得到下一个索引,即总数。我将检查整个ArrayList中是否有类似的I

我正在寻找一种很好的方法,根据特定的条件总结我的ArrayList中的一些特定数据,但我无法使其按预期工作。My ArrayList包含以下数据序列
域、IP、总数
,例如:

[gmail.com", "172.11.0.89", 1, gmail.com", "172.11.0.89", 60, "gmail.com", "192.168.0.66", 13] 
我试图做的是循环遍历ArrayList并检索
IP
地址。之后,我将得到下一个索引,即
总数
。我将检查整个ArrayList中是否有类似的IP。如果我找到一个类似的IP,我会做同样的事情,将
总数
与之前的
总数
相加。例如,
172.11.0.89
的总数应该包含61,因为60+1=61

但我没有得到那个输出。以下是我的示例输出:

[gmail.com", "172.11.0.89", 1, gmail.com", "172.11.0.89", 60, "gmail.com", "192.168.0.66", 13] 
The IP "172.11.0.89"
The IP "172.11.0.89"
The IP "192.168.0.66"
The Data in Final Data is :["172.11.0.89", 1, "172.11.0.89", 75, "172.11.0.89", 149, "192.168.0.66", 223]
这是我的源代码:

System.out.println(domainDailyData1);
for(int l = 1;l<domainDailyData1.size();l+=3)  // getting the total count 
  {
     String tempIP1 = domainDailyData1.get(l);
     System.out.println("The IP "+tempIP1);
     for(int e = 1;e<domainDailyData1.size();e+=3)
     {
         String tempIP2 = domainDailyData1.get(l);

          if(tempIP2.equals(tempIP1))
           {
              String str1 = domainDailyData1.get(e+1);

              int temp1 = Integer.parseInt(str1);
              num1 += temp1;
           }
     }
         FinalData1.add(tempIP1);
         FinalData1.add(String.valueOf(num1));

 }
   System.out.println("The Data in Final Data is :"+FinalData1);
System.out.println(domainDailyData1);
对于(int l=1;l固定错误
正如前面提到的注释,您忘记初始化一些变量。首先,由于您没有在代码中明确定义,我假设
finadat1
是一个
列表

  • 您忘记初始化
    num1
  • 您需要记住,您已经扫描了特定的ip地址
  • 在第二个for循环中,您混淆了迭代器:您使用了
    get(l)
    而不是
    get(e)
    。使用
    get(l)
    ,您将始终拥有
    tempIP2.equals(tempIP1)=true
    作为
    tempIP1=domainDailyData1.get(l)
  • 经过更正,您的代码如下所示:

    public static void main(String... aArgs) {
       List<String> domainDailyData1 = Arrays.asList(new String[]{
            "gmail.com", "172.11.0.89", "1",
            "gmail.com", "172.11.0.89", "60",
            "gmail.com", "192.168.0.66", "13"});
    
        // >>> convention: don't use capital letter as the first letter of a variable
        List<String> finalData1 = new ArrayList<>();
    
        // getting the total count 
        for (int l = 1; l < domainDailyData1.size(); l += 3) {
            String tempIP1 = domainDailyData1.get(l);
    
            // 2. to avoid looping an IP that you already counted
            if (!finalData1.contains(tempIP1)) {
                
                System.out.println("The IP " + tempIP1);
                
                // 1. num1 initialisation
                int num1 = 0;
                
                for (int e = 1; e < domainDailyData1.size(); e += 3) {
                    
                    // 3. iterator confusion
                    String tempIP2 = domainDailyData1.get(e);
                    
                    if (tempIP2.equals(tempIP1)) {
                        String str1 = domainDailyData1.get(e + 1);
                        int temp1 = Integer.parseInt(str1);
                        num1 += temp1;
                    }
                }
                
                finalData1.add(tempIP1);
                finalData1.add(String.valueOf(num1));
            }
        }
        
        System.out.println("The Data in Final Data is :" + finalData1);
    }
    
    如果要复制粘贴以进行测试

    • 没有解释
    • 并以静态法为参考
    • 没有
      peek()
    • 非地图定义,直接打印结果:
    代码是:

    public static void main(String... aArgs) {
        
        List<String> domainDailyData1 = Arrays.asList(new String[]{ "gmail.com", "172.11.0.89", "1", "gmail.com", "172.11.0.89", "60", "gmail.com", "192.168.0.66", "13"});
            
        Stream
            .iterate(1, i -> i + 3)
            .limit(domainDailyData1.size() / 3)
            .collect(Collectors.toMap(
                    i -> domainDailyData1.get(i),
                    i -> {
                        try {
                            return Integer.parseInt(domainDailyData1.get(i + 1));
                        }
                        catch (NumberFormatException e) {
                            return 0;
                        }
                    },
                    Integer::sum))
            .entrySet()
            .stream()
            .forEach(System.out::println);
    }
    
    publicstaticvoidmain(字符串…aArgs){
    List domainDailyData1=Arrays.asList(新字符串[]{“gmail.com”、“172.11.0.89”、“1”、“gmail.com”、“172.11.0.89”、“60”、“gmail.com”、“192.168.0.66”、“13”});
    流动
    .迭代(1,i->i+3)
    .limit(domainDailyData1.size()/3)
    .collect(collector.toMap)(
    i->domainDailyData1.get(i),
    我->{
    试一试{
    返回Integer.parseInt(domainDailyData1.get(i+1));
    }
    捕获(数字格式){
    返回0;
    }
    },
    整数(和)
    .entrySet()
    .stream()
    .forEach(System.out::println);
    }
    
    这是为了好玩,所以这段代码显然不是100%防错的


    资料来源:

    • 词汇:
    • 失败的想法:
    修复错误 正如前面提到的注释,您忘记初始化一些变量。首先,由于您没有在代码中明确定义,我假设
    finadat1
    是一个
    列表

  • 您忘记初始化
    num1
  • 您需要记住,您已经扫描了特定的ip地址
  • 在第二个for循环中,您混淆了迭代器:您使用了
    get(l)
    而不是
    get(e)
    。使用
    get(l)
    ,您将始终拥有
    tempIP2.equals(tempIP1)=true
    作为
    tempIP1=domainDailyData1.get(l)
  • 经过更正,您的代码如下所示:

    public static void main(String... aArgs) {
       List<String> domainDailyData1 = Arrays.asList(new String[]{
            "gmail.com", "172.11.0.89", "1",
            "gmail.com", "172.11.0.89", "60",
            "gmail.com", "192.168.0.66", "13"});
    
        // >>> convention: don't use capital letter as the first letter of a variable
        List<String> finalData1 = new ArrayList<>();
    
        // getting the total count 
        for (int l = 1; l < domainDailyData1.size(); l += 3) {
            String tempIP1 = domainDailyData1.get(l);
    
            // 2. to avoid looping an IP that you already counted
            if (!finalData1.contains(tempIP1)) {
                
                System.out.println("The IP " + tempIP1);
                
                // 1. num1 initialisation
                int num1 = 0;
                
                for (int e = 1; e < domainDailyData1.size(); e += 3) {
                    
                    // 3. iterator confusion
                    String tempIP2 = domainDailyData1.get(e);
                    
                    if (tempIP2.equals(tempIP1)) {
                        String str1 = domainDailyData1.get(e + 1);
                        int temp1 = Integer.parseInt(str1);
                        num1 += temp1;
                    }
                }
                
                finalData1.add(tempIP1);
                finalData1.add(String.valueOf(num1));
            }
        }
        
        System.out.println("The Data in Final Data is :" + finalData1);
    }
    
    如果要复制粘贴以进行测试

    • 没有解释
    • 并以静态法为参考
    • 没有
      peek()
    • 非地图定义,直接打印结果:
    代码是:

    public static void main(String... aArgs) {
        
        List<String> domainDailyData1 = Arrays.asList(new String[]{ "gmail.com", "172.11.0.89", "1", "gmail.com", "172.11.0.89", "60", "gmail.com", "192.168.0.66", "13"});
            
        Stream
            .iterate(1, i -> i + 3)
            .limit(domainDailyData1.size() / 3)
            .collect(Collectors.toMap(
                    i -> domainDailyData1.get(i),
                    i -> {
                        try {
                            return Integer.parseInt(domainDailyData1.get(i + 1));
                        }
                        catch (NumberFormatException e) {
                            return 0;
                        }
                    },
                    Integer::sum))
            .entrySet()
            .stream()
            .forEach(System.out::println);
    }
    
    publicstaticvoidmain(字符串…aArgs){
    List domainDailyData1=Arrays.asList(新字符串[]{“gmail.com”、“172.11.0.89”、“1”、“gmail.com”、“172.11.0.89”、“60”、“gmail.com”、“192.168.0.66”、“13”});
    流动
    .迭代(1,i->i+3)
    .limit(domainDailyData1.size()/3)
    .collect(collector.toMap)(
    i->domainDailyData1.get(i),
    我->{
    试一试{
    返回Integer.parseInt(domainDailyData1.get(i+1));
    }
    捕获(数字格式){
    返回0;
    }
    },
    整数(和)
    .entrySet()
    .stream()
    .forEach(System.out::println);
    }
    
    这是为了好玩,所以这段代码显然不是100%防错的


    资料来源:

    • 词汇:
    • 失败的想法:

    你应该考虑建立一个以IP为密钥的映射,总的来说是一个值。或者更好的是,一个带有字段“代码>域
    的类,<代码> IP 和<代码> ToalNo.< /Cord>并填充你的列表。代码中有几个错误。NUM1没有用每个循环调用初始化,并且你写了字符串TEMPIP2= DoMaDunaLyDATA数据。1.get(l);当它应该是字符串tempIP2=domainDailyData1.get(e)应该有很多更好的方法来处理这个问题,而不是试图迭代一个数组的值。你应该考虑建立一个以IP为关键字的映射,总的为值。或者,更好的是,一个具有字段“代码>域< /COD>”的类,<代码> IP 和<代码> ToalNo.< /Cord>。不是每个循环调用都初始化code.num1,您编写了字符串tempIP2=domainDailyData1.get(l);当它应该是字符串tempIP2=domainDailyData1.get(e)时;有许多更好的方法来处理此问题,而不是尝试遍历值的数组列表。感谢您的非常详细的解释,祝您愉快谢谢您的非常详细的解释,祝您愉快