2017-03-22 9 views
0

Ich habe drei Arraylisten. Zwei Haltekoordinaten für Punkte auf einer Leinwand (xCoord, yCoord). Dies ist ein Punkt-zu-Punkt-Programm. Die dritte Arraylist hält den Code, um zu berechnen, welche Punkte von der Leinwand mit dem geringsten "Schaden" oder Beschädigung des resultierenden Bildes entfernt werden können. Dies basiert auf einem einfachen Algorithmus, der einen "kritischen Wert" zurückgibt. Punkte mit kleineren kritischen Werten verschlechtern das Bild weniger als solche mit höheren kritischen Werten.Entferne Elemente von ArrayList basierend auf einer anderen ArrayList

Mein Problem ist die Entfernung von n Punkten aus den X- und Y-Arraylisten basierend auf dem kleinsten kritischen Wert. Ich habe den Code für die Benutzereingabe bereits implementiert.

public void removeDots(int numberDesired){ 
    int i = 0; 

    for (i =0; i<numberDesired; i++){ 

     xCoord.remove(critDots.get(i); //No idea, just trying random things. 
     yCoord.remove(critDots.get(i); 

    } 
} 


    for (i = 0; i < xCoord.size()-1; i++) { 
      critValue = Algorithm Calculations 
      critDots.add(critValue); 
     } 

Ich habe von

Collections.sort(critDots) 

aus den am wenigsten kritisch kritischsten zu organisieren mit gedacht, aber ich bin nicht sicher, wie dies die Reihenfolge meiner xKoord/yKoord beeinflussen.

Nur ein paar Tipps, die mir helfen, in die richtige Richtung zu gehen, wären sehr willkommen. Außerdem sind xCoord, yCoord und critDots alle Arraylisten.

+0

'Die dritte Arraylist enthält den Code, um zu berechnen, welche Punkte von der Leinwand entfernt werden können' mit 'Punkt' meinst du ein Paar' x' und 'y' Koordinaten, die entfernt werden sollen? –

+0

Ja, das ist richtig – Fed148

+1

Bitte geben Sie eine vollständige [mcve] anstelle von Teilen des Codes zu erklären. Frage ist zum Beispiel: Welche Art von Objekten speichern Sie in diesen Listen? Wie ich denke: Sie rufen wahrscheinlich die remove (Objekt) anstelle von (index) Methoden aus Versehen (oder umgekehrt). Das kann passieren, weil int-Werte automatisch in Integer-Objekte eingeschlossen werden. Eigentlich ist das hier sehr wahrscheinlich der Fall. – GhostCat

Antwort

0

Setzen Sie Ihre x- und y-Wert in einer separaten Dot Klasse:

class Dot { 
    private final int x; 
    private final int y; 

    // hashValue and equals methods 
} 

Bewahren Sie die Liste von Punkten auf der Leinwand in einer Liste:

List<Dot> dots; 

Dies ist wahrscheinlich ein viel besser sein Modell für Sie als Speichern von X- und Y-Koordinaten in separaten Listen. Es ist auch besser OO-Design, wie Sie Attribute zu den Punkten (z. B. Farbe) hinzufügen können, ohne das Modell zu ändern.

Verwenden Sie Ihre ‚Schaden‘ Algorithmus, um die Punkte zu bekommen den kleinsten Schaden zu verursachen:

List<Dot> toRemove = dots.stream() 
    .sort(comparingInt(d -> calculateDamageForDot(d))) 
    .limit(numberToRemove) 
    .collect(toList()); 

Wenn Sie mit Streams nicht vertraut sind, dann mich in den Kommentaren wissen lassen und ich werde einen alten Stil Iteration liefern das macht das Äquivalent.

Dann endlich entfernen Punkte mit den kleinsten Schaden:

dots.removeAll(toRemove); 
+0

Danke, eine Dot-Klasse zu machen macht sehr viel Sinn, ich werde das tun. – Fed148

0

Wie Sie dot meinen Sie Paar x und y Koordinaten sagte, dass, dann sind Sie beide brauchen, während sie von ArrayList entfernen . Finden Sie einfach ein Paar von x und y Koordinaten und entfernen Sie sie.

Denken Sie daran, beide zu entfernen, da Sie die Reihenfolge beibehalten müssen.

public void removeDots(int x, int y){ 
    //find that pair 
    for(i=0; i<xCoord.size(); i++) { 
     if(xCoord.get(i) == x && yCoord.get(i) == y) { 
      xCoord.remove(i); 
      yCoord.remove(i); 
      break; //don't remove this break if there are duplicate co-ordinates in your lists. 
     } 
    } 
} 

Jetzt einfach die obige Methode aufrufen und entfernen Sie sie:

... 
removeDots(3, 5); 
... 

Allerdings wäre es besser, einen benutzerdefinierten Datentyp für Ihre „Punkte“ zu erstellen, anstatt die Verwaltung von zwei Arraylisten wie diese.

Verwandte Themen