2016-08-26 1 views
0

J'essaie de comparer un tas d'objets de la même classe pour rechercher des ID correspondants? Ceci est la GroupClass, quand une nouvelle entrée est entrée, elle va tester par rapport à l'idNumber pour voir s'il y a une correspondance.Comment chercher une liste d'objets pour trouver une correspondance?

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; 
} 
} 

C'est la principale méthode

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

} 

Ive vu quelques questions comme elle, mais juste ne peux pas le faire fonctionner pour mon cas particulier, merci à l'avance.

+0

ajouter hashCode et est égal à GroupClass –

+0

si ID est unique, essayez peut-être d'utiliser 'HashMap' à la place? – Rogue

Répondre

0

Pas tout à fait sûr quel est votre objectif. Si vous souhaitez rejeter toute nouvelle entrée si l'identifiant existe déjà, vous devez remplacer les hashCode et equals méthodes du GroupClass afin que LinkedHashSet sait si deux objets GroupClass sont différents:

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

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

Cependant, dans la plupart des cas, vous pourriez vouloir récupérer une entrée en utilisant son numéro d'identification. Ensuite, il pourrait être préférable d'utiliser une carte avec identifiant comme clé, et le GroupoClass lui-même objet que la valeur

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

et vous devrez utiliser groupmap.keySet() pour itérer la carte.

+0

Je l'ai changé pour la HashMap et ça a très bien fonctionné, merci pour ça !! – user3488019

1

Conformément au commentaire ci-dessus, vous substituez la méthode equals, mais cela peut ne pas convenir à la croissance à long terme de la classe.

Mais en utilisant votre code existant essayer

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

et

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

Cela peut être utilisé comme

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

également pour trouver que vous pouvez utiliser les flux: 'groupArray.stream(). Filter (gr -> gr.getIdNumber() == id) .findFirst(). OrElse (null)' – maxpovver

+1

@maxpovver Donnez-moi une pause, Je viens de passer de JDK1.6 ;-) –