【问题标题】:How to look though a list of Objects to find a match?如何查看对象列表以找到匹配项?
【发布时间】:2016-08-26 06:33:43
【问题描述】:

我正在尝试比较同一类的一堆对象以搜索匹配的 ID? 这是 GroupClass,当输入一个新条目时,它将根据 idNumber 进行测试以查看是否匹配。

Public GroupClass {

private int idNumber;
private String name;
private double income;


public GroupClass(int id, String name, double income){
    this.idNumber = id;
    this.name = name;
    this.income = income;
}

public int getIdNumber() {
    return idNumber;
}

public void setIdNumber(int idNumber) {
    this.idNumber = idNumber;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public double getIncome() {
    return income;
}

public void setIncome(double income) {
    this.income = income;
 }
}

这是主要方法

import static java.lang.reflect.Array.set;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;


    public class ListTester {
    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    Set<GroupClass> groupArray = new LinkedHashSet<>();
    System.out.println("Enter a ID Number");
    int id = input.nextInt();
    System.out.println("Enter a First Name");
    String name = input.next();
    System.out.println("Enter a an Income");
    double income = input.nextDouble();


    groupArray.add(new GroupClass(1111, "Billy", 178000));
    groupArray.add(new GroupClass(1112, "Sam", 78000));
    groupArray.add(new GroupClass(1113, "Mark", 79000));

    groupArray.add(new GroupClass(id, name, income));
    printTheClass(groupArray);


}

public static void printTheClass(Set group){
    for(Object theArray: group){
        System.out.println(theArray + " ");
    }
}

}

我已经看到了一些类似的问题,但无法让它适用于我的特殊情况,提前致谢。

【问题讨论】:

  • 将 hashCode 和 equals 添加到 GroupClass 中
  • 如果 id 是唯一的,或许可以尝试使用 HashMap 代替?

标签: java hashset linkedhashset


【解决方案1】:

根据上述评论,您覆盖了equals 方法,但这可能不适合类的长期增长。

但是使用你现有的代码试试

public static void printTheClass(Set<GroupClass> group){
    for(GroupClass theArray: group){
        System.out.println(theArray + " ");
    }
}

public static GroupClass findTheClass(Set<GroupClass> group, int id){
    for(GroupClass obj: group){
        if(obj.getIdNumber == id) return obj;
    }
    return null;
}

这可以用作

if (findTheClass (groupArray, id) == null) {
  groupArray.add (new GroupClass(id, name, income));
}

【讨论】:

  • 也可以使用流:groupArray.stream().filter(gr -&gt; gr.getIdNumber() == id).findFirst().orElse(null)
  • @maxpovver 让我休息一下,我刚从JDK1.6升级;-)
【解决方案2】:

不太确定您的目标是什么。如果要在 id 已存在的情况下拒绝任何新条目,则需要覆盖 GroupClasshashCodeequals 方法,以便 LinkedHashSet 知道两个 GroupClass 对象是否不同:

@Override
public int hashCode() {
    return this.idNumber;
}

@Override
public boolean equals(Object obj) {
    return obj instanceof GroupClass && ((GroupClass) obj).getIdNumber() == this.idNumber;
}

但是,在大多数情况下,您可能希望使用其 ID 号检索条目。那么使用 id 作为 key 的 map 和 GroupoClass 对象本身作为 value 可能会更好

Map<Integer, GroupClass> groupmap = new HashMap<>()
groupmap.put(id, new GroupClass(id, name, income));

您将不得不使用groupmap.keySet() 来迭代地图。

【讨论】:

  • 我已将其更改为 HashMap,效果非常好,谢谢!!
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2019-09-21
  • 2017-09-12
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多