2016-05-05 12 views
0

Ich muss die Gleichen für meine Zugklasse überschreiben, die drei Attribute hat: Nummer, Wagen und Typ; Zwei Züge sind nur dann gleich, wenn ihre Nummern gleich sind. Ich muss testen, ob Duplikate in meinem Zug SET sind. Wie kann ich das machen ? Dies ist, was ich bisher getan habe:Wie man Gleichgestellte für eine Klasse personifiziert und gleiche Werte in einem Satz prüft?

public class Train { 
    private int number; 
    private String type; 
    private int wagons; 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public int getWagons() { 
     return wagons; 
    } 

    public void setWagons(int wagons) { 
     this.wagons = wagons; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     Train otherTrain = (Train) obj; 
     boolean equal = false; 
     if (otherTrain.getNumber() == this.getNumber()) { 
      equal = true; 
     } 
     return equal; 
    } 

Züge DAO:

public class TrainsDAO { 
    private Set<Train> trainSet = new HashSet<Train>(); 

    public Set<Train> pupulateTheSet() { 
     Random random = new Random(); 

     for (int i = 1; i < 1000; i++) { 
      Train train = new Train(); 
      train.setNumber(random.nextInt(10)); 
      train.setWagons(random.nextInt(30)); 
      train.setType("Inter-city"); 
      trainSet.add(train); 
     } 
     return trainSet; 
    } 

    public static void main(String[] args) { 
     TrainsDAO trainsDAO = new TrainsDAO(); 
     Set<Train> trains = trainsDAO.pupulateTheSet(); 
     for (Train train : trains) { 
      System.out.println(train); 
     } 
    } 
} 

Und die Tests:

public class TrainTest extends TestCase { 

    private TrainsDAO trainsDAO = new TrainsDAO(); 
    private Set<Train> trainSet = trainsDAO.pupulateTheSet(); 
    public TrainTest(String name) { 
     super(name); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
    } 

    @Test 
    public void testIfThereAreEqualValuesInSet() { 
     assertTrue(!duplicateFound()); 
    } 

    private boolean duplicateFound() { 
     //check if there are duplicates in the set return true if there are no false otherwise 
     return false; 
    } 
} 
+0

Wenn Sie HashCode und equals richtig implementiert haben, wird Set keine Duplikate erlauben, mehr wie in der Dokumentation sollte HashCode und Equals-Implementierung ähnlich sein, wenn a.equals (b) dann a.hashCode() == b. hashCode() –

+0

Sie müssen auch 'hashCode' überschreiben, in Übereinstimmung mit' equals'. –

Antwort

1

Ihre equals Überschreibung wie jetzt umgesetzt werfen kann:

  • NullPointerException, wenn das Argument null
  • ClassCastException, da es das Object Argument vor dem Gießen nicht instanceof Scheck ist zu Train

Sie möchten, dass beheben.

Noch wichtiger ist für Hash-basierten Sammlungen, müssen Sie die Object#hashCode Methode @Override konsequent mit equals (dh durch einen Hash-Code der Rückkehr auf der Grundlage Ihres Zugnummer).

Überschreiben hashCode korrekt wird sichergestellt, dass Ihre Train s in verschiedenen Hash-Buckets gesetzt werden, wenn ihre Zahlen unterschiedlich sind.

Beachten Sie auch: es scheint sinnlos Unit-Tests zu haben, um doppelte Werte in einer Set Überprüfung - der ganze Sinn eines Set ist, dass es funktioniert nicht Duplikate erlauben.

Dokumente here.