2010-09-03 2 views
1

De manière générale, pouvez-vous suggérer une approche qui me permettrait de tester des objets pour m'assurer qu'ils sont semblables.Comment détecter la "ressemblance" des données

Accepter que les objets soient identiques si plus de 'n%' du contenu de l'objet est identique.

Autre puis une force brute, y at-il des bibliothèques disponibles dont je peux profiter?

grâce

+3

Ceci est une question trop générale. Veuillez fournir des informations supplémentaires sur ce que vous envisagez de faire. –

+1

Quel type d '«objet/données»: instances de classe Java arbitraires? Formes 3D? – ChrisW

+0

Selon javap, String a 4 membres d'instance: value, offset, count, hash. ("Hello World", 0,5, -1) et ("Good Bye World", 0,5, -1) se ressemblent au niveau de 75%. Soit NotString une classe implémentant CharSequence qui n'a pas ces 4 membres d'instance. Quelle est la relation d'analogie entre String "Hello World" et NotString "Hello World"? – emory

Répondre

0

Une chose que vous pouvez essayer coder les objets comparer le résultat ... En particulier, j'ai fait avec JSON. Pour détecter si les objets correspondent complètement, c'est simple.

1

Cela ne peut être fait qu'au cas par cas. Si je vraiment besoin de cette fonctionnalité, je définir une interface:

public interface Similar<Entity> { 
boolean isSimilar(Entity other); 
} 

Chaque mise en œuvre de classe peut définir ce que signifie être « similaire » à une autre instance. Les choses à garder à l'esprit seraient mêmes questions que vous garder à l'esprit pour le clonage: copie superficielle vs copie en profondeur, etc.

mise en œuvre Naive de la personne:

public class Person implements Similar<Person> { 
    private String firstName; 
    private String lastName; 

    public String getLastName() { 
     return lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public boolean isSimilar(Person other) { 
     if (other != null) { 
      if (lastName.equalsIgnoreCase(other.getLastName()) 
       || (firstName.equalsIgnoreCase(other.getFirstName()))) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 
3

En tant que point de départ, jetez un oeil à quelque chose appelé Levenshtein distance et voir si cela est pertinent pour votre utilisation?

1

Je crois que vous pouvez trouver une bonne solution si vous vous concentrez sur les détails de votre problème spécifique. La seule solution "raisonnable" que j'ai à l'esprit pour le cas général est basée sur reflection: balayer les membres de données et trouver des similitudes des paires correspondantes de membres récursivement.

Cependant, il y a tellement de problèmes avec cette idée, donc je ne pense pas que ce soit faisable. Parmi eux:

1) Le concept poids des sous-arbres membres doit être bien défini afin de pouvoir retourner un pourcentage de similarité.

2) Comment gérer les membres de données qui n'appartiennent qu'à l'un des objets? cela se produira fréquemment en comparant une instance de classe A à une instance d'une classe descendante B.

3) Peut-être le plus gros problème: Le mappage entre la structure interne d'un objet et sa représentation abstraite des données n'est pas une fonction injective . Par exemple, deux hashmaps représentant le même mappage peuvent avoir une structure interne différente, en raison d'un historique différent des réallocations de table.

0

Vous pouvez implémenter l'interface Comparable et définir votre propre 'logique' pour comparer les instances d'une classe.

Comme mentionné précédemment, pour les similitudes de texte, vous pouvez utiliser des algorithmes de calcul de distance que vous pouvez trouver dans la bibliothèque SimMetrics (http://www.dcs.shef.ac.uk/~sam/simmetrics.html).

Une autre façon de comparer est de comparer les hashcodes de l'objet (après avoir remplacé la méthode hashCode() de la classe Object) - notez bien que c'est ce que vous recherchez.

Questions connexes