Java 汇总arraylist中的特定数据
我正在寻找一种很好的方法,根据特定的条件总结我的ArrayList中的一些特定数据,但我无法使其按预期工作。My 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
域、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)时;有许多更好的方法来处理此问题,而不是尝试遍历值的数组列表。感谢您的非常详细的解释,祝您愉快谢谢您的非常详细的解释,祝您愉快