Comment comparer deux tableau liste pour des objets qui diffèrent par au moins une propriété en java?
J'ai deux liste de tableau. Chacune dispose d'une liste d'Objets de type Utilisateur.
L'Utilisateur de la classe ressemble à ci-dessous
public class User {
private long id;
private String empCode;
private String firstname;
private String lastname;
private String email;
public User( String firstname, String lastname, String empCode, String email) {
super();
this.empCode = empCode;
this.firstname = firstname;
this.lastname = lastname;
this.email = email;
}
//getters and setters
}
import java.util.ArrayList;
import java.util.List;
public class FindSimilarUsersWithAtLeastOneDifferentProperty {
/**
* @param args
*/
public static void main(String[] args) {
//TODO Auto-generated method stub
List<User> list1 = new ArrayList<User>();
list1.add(new User("F11", "L1", "EMP01", "[email protected]"));
list1.add(new User("F2", "L2", "EMP02", "[email protected]"));
list1.add(new User("F3", "L3", "EMP03", "[email protected]"));
list1.add(new User("F4", "L4", "EMP04", "[email protected]"));
list1.add(new User("F5", "L5", "EMP05", "[email protected]"));
list1.add(new User("F9", "L9", "EMP09", "[email protected]"));
list1.add(new User("F10", "L10", "EMP10", "[email protected]"));
List<User> list2 = new ArrayList<User>();
list2.add(new User("F1", "L1", "EMP01", "[email protected]"));
list2.add(new User("F2", "L2", "EMP02", "[email protected]"));
list2.add(new User("F6", "L6", "EMP06", "[email protected]"));
list2.add(new User("F7", "L7", "EMP07", "[email protected]"));
list2.add(new User("F8", "L8", "EMP08", "[email protected]"));
list2.add(new User("F9", "L9", "EMP09", "[email protected]"));
list2.add(new User("F100", "L100", "EMP10", "[email protected]"));
List<User> resultList = new ArrayList<User>();
//this list should contain following users
//EMP01 (common in both list but differs in firstname)
//EMP02 (common in both list but differs in email)
//EMP10 (common in both list but differs in firstname, lastname and email)
}
}
Si vous voyez le code d'exemple, les deux listes ont quatre utilisateurs avec emp code EMP01, EMP02, EMP09 et EMP10 commun.
Donc, nous avons seulement besoin de comparer les propriétés de ces quatre utilisateurs.
Si l'un des utilisateurs ont au moins une propriété différente, elle doit être ajoutée dans la liste des résultats.
Veuillez vous informer sur comment puis-je aller à ce sujet?
- Le resutList contiennent à la fois de l'utilisateur similaire?
- Gurung. Non seulement les utilisateurs de la liste 1.
- Quel est le empcode, doivent-ils correspondre?
- Gurung. Nous avons besoin de comparer les utilisateurs de correspondance emp codes seulement. Donc, si la liste 1 a emp de code à e1 et liste 2 ont également emp de code à e1, alors seulement nous avons besoin de comparer leurs propriétés. Si emp codes diffèrent même avec le même nom, ils ne devraient pas être égalé. Donc, il suffit de voir les deux listes, à voir les emp codes, puis de comparer leurs prioperties.
Vous devez vous connecter pour publier un commentaire.
Je pense que ce que vous devez faire -
Il ne pourrait pas faire de sens pour le
User
pour remplacerequal
ethashCode
seulement pour servir cet objectif. Ils doivent être redéfinies dans la façon dont il est plus judicieux de domaine-sage.Mettre en œuvre est égal à, hashcode dans
User
Ensuite utiliser retainAll
equals
est lié à ramper comme une erreur plus tard. Si vous voulez comparer les clés de l'égalité, de l'utilisation de l'égalité de la fonction de la clé, ou à une liste ou une table de hachage basée sur la touche. Mais la prochaine développeur probablement suppose queequals
tests tous attributs. Je l'avais presque vous donner un -1 pour ce l'abus d'égal à égal, mais d'un autre côté j'aime la référence à retainAll.L'approche canonique est comme suit:
countDifferences
qui compte le nombre de différences entre les utilisateursSi vous mettez le poids sur les différentes propriétés vous pouvez également contrôler que par exemple un match de l'attribut ID est plus fort qu'un match dans le nom.
Mise à jour: désolé, mal lu votre commentaire que l'attribut ID doit match.
Remplacer 2) avec "trouver l'objet qui a le même ID". Autre que cela, j'ai encore recommandons de compter le nombre de différences. Il est plus souple, que vous pouvez définir des seuils pour de bon ou de mauvais matchs etc.
Ajouter cette méthode à votre classe d'Utilisateur:
Puis, dans la
main()
faire:C'est simple. Remplacer
equal
méthode dans votreUser
classe. Un très simple de mise en œuvre(vous pouvez l'améliorer en utilisant null chèques etc) peut être comme ci-dessous:Une fois cela fait, vous pouvez utiliser:
J'ai utilisé de la façon suivante pour comparer deux personnalisées
ArrayList
.