2016-08-26 7 views
0

Я пытаюсь сравнить кучу объектов одного и того же класса для поиска совпадающих идентификаторов? Это 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 + " "); 
    } 
} 

} 

Я видел несколько вопросов, как это, но просто не могу заставить его работать на моем конкретном случае, спасибо заранее.

+0

добавить hashCode и равно в GroupClass –

+0

, если id уникален, возможно, попробуйте вместо этого использовать 'HashMap'? – Rogue

ответ

0

Не совсем уверен, что ваша цель. Если вы хотите отказаться от какого-либо нового элемента, если идентификатор уже существует, необходимо переопределить hashCode и equals методы из GroupClass так, что LinkedHashSet знает, если два GroupClass объектов различны:

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

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

Однако, в большинстве случаев, вы можете захотеть получить запись, используя свой номер идентификатора. Тогда это может быть лучше использовать карту с идентификатором в качестве ключа, а GroupoClass сам объект в качестве значения

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

, и вы должны будете использовать groupmap.keySet() итерировать карту.

+0

Я изменил его на HashMap, и он отлично поработал, спасибо за это! – user3488019

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)); 
} 
+0

также для поиска вы можете использовать потоки: 'groupArray.stream(). Filter (gr -> gr.getIdNumber() == id) .findFirst() .EELE (null)' – maxpovver

+1

@maxpovver Дайте мне перерыв, Я только что обновился от JDK1.6 ;-) –