2016-12-09 5 views
0
private List<String> values = new ArrayList<String>(); 

public WhitespaceEqualsTest() { 
    values.add("I "); 
    values.add("I"); 
    values.add(". "); 
    values.add("."); 
    values.add("1"); 
    values.add("1 "); 

    System.out.println(refine(values)); 
} 

private List<String> refine(List<String> input){ 
    ArrayList<String> outerLoopValues = (ArrayList<String>) input; 
    ArrayList<String> innerLoopValues = (ArrayList<String>) input; 
    ArrayList<String> results = new ArrayList<String>(); 

    for(String string1 : outerLoopValues){ 
     for(String string2 : innerLoopValues){ 
      if(string1.contains(string2) == false){ 
       results.add(string1); 
      } 
     } 
    } 

    Set<String> temp = new HashSet<String>(); 
    temp.addAll(results); 
    results.clear(); 
    results.addAll(temp); 

    return results; 
} 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((values == null) ? 0 : values.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    WhitespaceEqualsTest other = (WhitespaceEqualsTest) obj; 
    if (values == null) { 
     if (other.values != null) 
      return false; 
    } else if (!values.equals(other.values)) 
     return false; 
    return true; 
} 

Arbeits ich die hashCode() und equals() außer Kraft gesetzt habe, so bin ich nicht wirklich sicher, was falsch ist. Sie werden mit Eclipse erzeugt (Source -> HashCode() und Equals() generieren). Warum erkennt es nicht, dass das gleiche Zeichen ohne Leerzeichen in einem Zeichen mit einem Leerzeichen enthalten ist? Die Ausgabe lautet:enthält() -Methode nicht

[1, . , I , I, ., 1 ]

+1

Warum nicht die ganze Zeit ArrayList verwenden, anstatt die Liste herumzuwerfen? –

+1

Ich bezweifle, dass Sie 'hashCode()' und 'equals (String)' für 'java.lang.String' überschrieben haben. Bitte geben Sie diesen Code an. Sie haben nur einen Test zur Verfügung gestellt, der (scheinbar) genauso funktioniert wie für 'String'. – CollinD

+0

Ich zitiere @ CollinD. Und auch angenommen, Sie haben möglicherweise gebrochen enthält, die verwendet gleich –

Antwort

-1

Sie die Werte in einem Set hinzuzufügen. In einem Set tritt in jedem Fall ein Wert auf - daher ist es ein Set. ;)

Genauso gut könnte man die Schleife ändern, um zu sehen, was

for(String string1 : outerLoopValues){ 
      for(String string2 : innerLoopValues){ 
       if(string1.contains(string2) == false){ 
        results.add(string1); 
        System.out.println("added \"" + string1 + "\" since it does not contain \"" + string2 + "\""); 
       } 
      } 
     } 

gibt die folgende Ausgabe geschieht:

added "I " since it does not contain ". " 
added "I " since it does not contain "." 
added "I " since it does not contain "1" 
added "I " since it does not contain "1 " 
added "I" since it does not contain "I " 
added "I" since it does not contain ". " 
added "I" since it does not contain "." 
added "I" since it does not contain "1" 
added "I" since it does not contain "1 " 
...... 
[1, . , I , I, ., 1 ] 

hinzuzufügen, ob sie die Idee sie nicht enthalten i vermuten?

Durch Drücken der Liste durch ein Set werden die Duplikate entfernt! Siehe hier: Does adding a duplicate value to a HashSet/HashMap replace the previous value

Ändern die Bedingung in der Schleife von false auf true Ausbeuten diese

added "I " since it does contain "I " 
added "I " since it does contain "I" 
added "I" since it does contain "I" 
added ". " since it does contain ". " 
added ". " since it does contain "." 
added "." since it does contain "." 
added "1" since it does contain "1" 
added "1 " since it does contain "1" 
added "1 " since it does contain "1 " 
[1, . , I , I, ., 1 ] 

Welche Ihre Frage beantwortet (keine Änderung nach dem Set/HashSet in der letzten Zeile der Ausgabe mit!): Es erkennt, wenn z "I" enthält "I".

System.out.println("I ".contains("I")); 

sagt "true"

hoffe, das hilft ^^ - d

+0

Nun, wenn das der Fall wäre, gäbe es nicht nur 3 Werte, wenn es richtig funktioniert? –

+0

Nein, deine 6 Werte sind "einzigartig" zumindest in dem Teil des Codes, in dem das Set ins Spiel kommt. In der Menge "I" steht nicht "Ich" und "." ist nicht ". ". http://stackoverflow.com/questions/12940663/does-adding-a-duplicate-value-to-a-hashset-hashmap-replace-the-previous-value –

+0

Das Set ist nicht das Problem hier, versuchen Sie den Code ausführen ohne das festgelegte Snippet. –

0

Wie in einer der Kommentare erwähnt, sollten Sie einen String-Wrapper werden mit den Strings ummanteln und die Gleichen außer Kraft setzen und Hashcode-Methoden.

Meine Lösung basiert auf der Annahme, dass "I " gleich "I" sein sollte, daher sollte nur einer von ihnen zum Ergebnis hinzugefügt werden.

aber ich werde zum Add-on muß, die jeweils in Java Objects und Java Arraylist in Bezug auf equals und contains Implementierung auf der Dokumentation. Die hashcode Methode müsste einen gemeinsamen Wert zurückgeben. Ich habe die Erklärung im Code als Kommentar geschrieben. Lassen Sie mich wissen, wenn es Probleme gibt.

Hauptklasse

public class StackOverflowMain 
{ 
    private static List<String> values = new ArrayList<String>(); 

    public static void main(String[] args) { 

     values.add("I "); 
     values.add("I"); 
     values.add(". "); 
     values.add("."); 
     values.add("1"); 
     values.add("1 "); 
     List<WhitespaceEqualsTest> toRefineList = new ArrayList<WhitespaceEqualsTest>(); 
     for (String value : values) { 
      toRefineList.add(new WhitespaceEqualsTest(value)); 
     } 

     System.out.println(refine(toRefineList)); 
    } 

    private static List<WhitespaceEqualsTest> refine(List<WhitespaceEqualsTest> input) { 
     ArrayList<WhitespaceEqualsTest> loopValues = (ArrayList<WhitespaceEqualsTest>) input; 
     ArrayList<WhitespaceEqualsTest> results = new ArrayList<WhitespaceEqualsTest>(); 

     for (WhitespaceEqualsTest value : loopValues) { 
      if (!results.contains(loopValues)) { 
       results.add(value); 
      } 
     } 

     Set<WhitespaceEqualsTest> temp = new HashSet<WhitespaceEqualsTest>(); 
     temp.addAll(results); 
     results.clear(); 
     results.addAll(temp); 

     return results; 

    } 
} 

Inner WhitespaceEqualsTest Klasse

class WhitespaceEqualsTest { 
    private String value; 

    public WhitespaceEqualsTest(String value) { 
     this.value = value; 
    } 

    public void setString(String value) { 
     this.value = value; 
    } 

    public String getString() { 
     return this.value; 
    } 

    public int hashCode() { 
     /* 
     * Arraylist.contains is evaluated by using (o==null ? e==null : o.equals(e)) as mentioned in the javadoc 
     * and Object.equals() would evaluate using hashcode() first to check if the object o is equal to object e 
     * before calling .equals() method to evaluate. 
     * 
     * As mentioned in java doc at http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#equals(java.lang.Object) 
     * c1.equals(c2) implies that c1.hashCode()==c2.hashCode() should be satisfied 
     * which is not in this question 
     */  
     return 0; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     WhitespaceEqualsTest other = (WhitespaceEqualsTest) obj; 
     if (value == null) { 
      if (other.value != null) 
       return false; 
     } else if (!value.contains(other.value) && !other.value.contains(value)){ 
      /* 
      * Does a checking on both ends since "I " contains "I" but "I" does not contain "I " due to the whitespace 
      * For this question, if one of the condition satisfy it should be equal 
      */ 
      return false; 
     }   
     return true; 
    } 

    @Override 
    public String toString() { 
     return this.value; 
    } 
} 

Ergebnis

[I , . , 1] 
+0

Dies könnte sein, was das OP tun wollte. Ich sehe, dass Sie sich bemühen, aber Sie beantworten nicht die Frage "Warum erkennt es nicht, dass das gleiche Zeichen ohne Leerzeichen in einem Zeichen mit einem Leerzeichen enthalten ist?" –

+0

Schauen Sie in die Equals-Methode, die ich habe hat die Kommentare dort hinzugefügt. Der Einfachheit halber verwendete OP 'object.equals()' im "überschriebenen" 'equals()', das java mit 'hashcode()' evaluiert, bevor es mit '.equals()' im OP-Code jede Zeichenkette ausgewertet hat ein einzigartiger Hashcode. Da der Hashcode unterschiedlich ist, gibt er false zurück und ist daher nicht gleich. Aber das ist nicht das, was für diese Frage gedacht ist, stattdessen sollte 'hashcode()' keinen eindeutigen Wert zurückgeben und 'String.contains()' sollte im überschriebenen '' verwendet werden.equals() 'Methode zum Auswerten. –

+0

Ja, es ist großartig, aber diese Frage bezieht sich auf die Methode contains (title is contains() -Methode funktioniert nicht). Und "I" .contains ("I") "ergibt sowieso wahr. 'System.out.println (" I ".enthält (" I "));' wenn du willst. :) –

0

String-Klasse ist endgültig. Sie können also die Methoden equals und hashCode nicht überschreiben.

Erstellen Sie eine Wrapper-Klasse von String, dann überschreiben Sie die Equals und Hashcode-Methode.

class StringWrapper { 
    private String value; 

    public StringWrapper(String value){ 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
    @Override 
    public String toString(){ 
     return value; 
    } 
    @Override 
    public boolean equals(Object obj){ 
     boolean result = Boolean.FALSE; 
     if(obj != null && obj instanceof StringWrapper){ 
      StringWrapper stringWrapper = (StringWrapper) obj; 
      result = value.trim().equals(stringWrapper.getValue().trim()); 
     } 
     return result; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((value.trim() == null) ? 0 : value.trim().hashCode()); 
     return result; 
    } 
} 
Verwandte Themen