gpt4 book ai didi

java - 如何计算具有多个字段的不同类/java 文档中 ArrayList 中的重复项?

转载 作者:行者123 更新时间:2023-12-02 03:09:22 24 4
gpt4 key购买 nike

有谁知道如何使用我拥有的代码得到以下答案?

aaa:3
bb:2
抄送:1

1:2
2:2
3:1
4:1

这是我迄今为止尝试过的:

这是主类

 package tester1;

import java.util.ArrayList;

public class Tester1 {


public static void main(String[] args) {
tester t1 = new tester(1,"aaa");
tester t2 = new tester(2,"aaa");
tester t3 = new tester(2,"aaa");
tester t4 = new tester(1,"ccc");
tester t5 = new tester(3,"bbb");
tester t6 = new tester(4,"bbb");
ArrayList<tester> list = new ArrayList<tester>();
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
list.add(t5);
list.add(t6);

test t = new test(list);
t.getter();
}

}

这是连接到数组列表的类

package tester1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class test {
private ArrayList<tester> testList;

public test(ArrayList<tester> testList) {
this.testList = testList;
}
public void getter()
{
Set<tester>unique = new HashSet<tester>(testList);
for(tester key:unique)
{
System.out.println(key.getName()+": "+Collections.frequency(testList, key.getName()));
}
}
}

这个类是构造函数所在的位置

package tester1;


public class tester {

private int num;
private String name;

public tester(int num, String name) {
this.num = num;
this.name = name;
}

public int getNum() {
return num;
}

public String getName() {
return name;
}

}

最佳答案

来自Collections#frequency的javadoc :

Returns the number of elements in the specified collection equal to the specified object. More formally, returns the number of elements e in the collection such that (o == null ? e == null : o.equals(e)).

那么,为什么到处都输出0呢?这非常简单,因为给定的合约永远无法解析为 true,因为没有 Tester 会等于 String

为了获得正确的输出,您必须首先覆盖 Tester 中的 equalshascode

// both are generated by eclipse source generation for the field name.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Tester other = (Tester) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

现在您需要更改 Collections#Frequency 调用以在 Tester 上工作,而不是在 Tester< 的 name 字段上工作:

// replaced key.getName() with key
System.out.println(key.getName() + ": " + Collections.frequency(testList, key));

您现在将获得正确的输出(只是未按发生次数排序):

bbb: 2
aaa: 3
ccc: 1

关于java - 如何计算具有多个字段的不同类/java 文档中 ArrayList 中的重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41281950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com