2016-03-30 11 views
2

Hoffentlich eine weitere einfache Frage, die nicht schwierig sein sollte, aber ich bin neu in Java und kämpfen. Ich habe eine Menge setElements in einer Klasse classA, die eine Reihe von Anthere-Klasse 'Objekte (classB) ist, die immer nur zwei Elemente enthält. Ich muss eine Methode vorbereiten, die ein Argument akzeptiert, und dann prüfen, ob eines der Elemente setElements diesem Argument entspricht. Wenn ein Element gleich ist, gibt die Methode das andere Element aus dem Satz zurück.Geben Sie das erste oder zweite Element in einem Satz

Ich kämpfe nur wirklich die Funktionalität zu erhalten, und ich bin ziemlich sicher, es aufgrund meiner mittelmäßig Java Fähigkeiten ist :)

Dies ist der Code Ich habe jetzt:

Set<classB> setElements = new HashSet<classB>(); 
public classA(classB x, class B y) { 
     setElements.add(x); 
     setElements.add(y); 


\\method to return the other element if one element is equal to argument 

public classB otherElement(classB argument){ 
    for (classB x:setElements){ 
     if (x==argument){ 
      return \\other element in setElements} } } 

Bitte Hilfe!

+0

Ich verstehe ganz nicht * "anderes Element in SetElements" *. Was ist der Typ von 'setElements'? Ist es ein 'HashSet'? Wie viele Elemente hat es? – user2004685

+0

hier verwendet Hash-Set hat keine Sortierung, oder Reihenfolge der Einfügefolge beibehalten –

+0

setElement wird nur 2 Elemente haben. Entschuldigung, ich habe den Set-Code nicht eingegeben. Ich werde es jetzt hinzufügen. – flexcookie

Antwort

0

Wenn Ihr Set immer genau zwei Elemente enthält, können Sie es in ein Array umwandeln, dann eine indizierte Schleife verwenden:

public classB otherElement(classB argument) { 

    classB[] arrayElements = new classB[2]; 
    setElements.toArray(arrayElements); 

    for (int i=0; i<arrayElements.length; i++) { 
     if (arrayElements[i] == argument) { 
      return setElements[1-i]; 
     } 
    } 
} 
+0

Warum verwenden Sie 'arrayElements.length' statt' 2'? Warum sollte ein 'Set' an erster Stelle verwendet werden, wenn Sie nur 2 Elemente haben. – martijnn2008

+0

@ martijnn2008 Bearbeitet, um .length zu verwenden. Aber wie gesagt, geht das (wie in der Frage) davon aus, dass es immer genau 2 Punkte geben wird. – starf

+0

Vielen Dank, ich schätze die Kommentare. Die Lernkurve für Java ist leicht steil und Sie sind eine unschätzbare Ressource :) – flexcookie

0

Ich weiß nicht, warum dieser Ansatz als Set modelliert wird. Wenn die Elemente eindeutig sein müssen, wäre die Verwendung einer Liste einfacher. Wenn man jedoch annimmt, dass es in einem Set zwei Elemente gibt, könnte man das Set iterieren und verfolgen, was gefunden wurde. Etwas wie:

public classB getOtherFromSet(classB arg) 
{ 
    // setElements is the set of elements, with two entries 
    classB otherVal = null; 
    for (classB x : setElements) { 
    if (! (x.equals(arg)) { 
     otherVal = x; 
    } 
    } 

    return otherVal; 
} 

Hinweis es könnte null zurückgeben, wenn das Set nur einen Wert gleich dem Argument enthielt.

Nebenbei wäre es am besten, wenn Java-Konventionen über Klassennamen befolgt würden.

+0

Vielen Dank, ich schätze die Kommentare. Die Lernkurve für Java ist ein wenig steil und Sie sind eine unschätzbare Ressource :) – flexcookie

0

Zunächst können Sie die Elemente in Ihrem HashSet nicht direkt aus Ihrer Klasse setzen. Sie müssen in irgendeiner Methode tun in wie folgt:

public void init() { 
    setElements.add(x); 
    setElements.add(y); 
} 

nach Ihren Wünschen würde ich vorschlagen, dass Sie einen ArrayList anstelle eines HashSet zu verwenden. Hier

ist der Code-Schnipsel:

public classA(classB x, classB y) { 

    private List<classB> setElements = Arrays.asList(x, y); 

    public classB otherElement(classB argument) { 
     if(0 == setElements.indexOf(argument)) { 
      return setElements.get(1); 
     } 
     return setElements.get(0); 
    } 
} 
+0

Vielen Dank, ich schätze die Kommentare. Die Lernkurve für Java ist leicht steil und Sie sind eine unschätzbare Ressource :) – flexcookie

+0

@flexcookie Your Welcome! :) Bitte stimmen Sie ab und akzeptieren Sie die Antwort, wenn es Ihnen geholfen hat. – user2004685

0

Die Elemente in einer allgemeinen Set keinen definierten Auftrag haben, so technisch gibt es kein „ersten“ noch „zweiten“ Element. Aber in Ihrem Fall ist die Aufgabe klar.

Wenn Sie sicher sind, dass der Satz immer genau zwei Elemente enthält, dann könnte man die ganze Arbeit ohne Loops und Konvertierungen:

public classB otherElement(classB argument){ 
    Iterator<classB> iterator = setElements.iterator(); 
    classB first = iterator.next(); 
    classB second = iterator.next(); 
    if (first.equals(argument)) 
     return second; 
    if (second.equals(argument)) 
     return first; 
    return null; 
} 

Wenn auch Sie sicher sind, dass die argument immer gleich sein wird, entweder „erster“ oder „zweites“ Element, dann könnte man dies noch einfacher ausdrücken:

public classB otherElement(classB argument){ 
    Iterator<classB> iterator = setElements.iterator(); 
    classB first = iterator.next(); 
    return first.equals(argument) ? iterator.next() : first; 
} 

Die Verwendung von Set in diesem Fall sehr fraglich ist, eigentlich. Ich würde empfehlen, stattdessen eine Methode mit drei Argumenten zu erstellen.Bitte vergleichen Sie die Lesbarkeit dieser Methode auf den beiden vorangegangenen:

public classB otherElement(classB argument, classB first, classB second){ 
    return first.equals(argument) ? second : first; 
} 

Bitte beachten Sie auch, dass Objekte in den meisten Fällen sollte über .equals() rather than == verglichen werden.

+0

Ausgezeichnet, ich denke, das ist, was ich gesucht habe. Ich habe ursprünglich mit next() versucht, aber offensichtlich die Syntax falsch. Ich schätze es! Nach allen Kommentaren denke ich, dass ich in diesem Fall definitiv den Hashset ablegen werde :) – flexcookie

+0

Gern geschehen! –

Verwandte Themen