2016-03-26 5 views
1

Ich versuche, zwei Listen zu vergleichen und hinzugefügt Einträge in eine Liste und entfernte Einträge in eine andere eingefügt. Hier ist der aktuelle Code:Vergleichen von zwei Listen und Sortieren von hinzugefügten und entfernten Einträge

 Map<Chunk, List<Player>> chunkListMap = new HashMap<>(); 

     for (Chunk c : affectedChunks) { 
      List<Player> currentPlayers = playersInChunk(c); 
      if (!chunkListMap.containsKey(c)) { 
       chunkListMap.put(c, currentPlayers); 
       continue; 
      } 
      List<Player> previousPlayers = chunkListMap.get(c); 

      List<Player> enteringPlayers = new ArrayList<>(currentPlayers); 
      enteringPlayers.removeAll(previousPlayers); 
      for (Player player : enteringPlayers) applyEffects(player); 

      List<Player> leavingPlayers = new ArrayList<>(previousPlayers); 
      leavingPlayers.removeAll(currentPlayers); 
      for (Player player : leavingPlayers) unapplyEffects(player); 
     } 

private List<Player> playersInChunk(Chunk c) { 
    List<Player> retVal = new ArrayList<>(); 
    for (Entity e : c.getEntities()) if (e instanceof Player) retVal.add((Player) e); 
    return retVal; 
} 

Die beiden Ergebnislisten (insingPlayers und leavePlayers) sind immer leer. Was mache ich falsch?

+1

Sie überprüfen Haben, wenn Sie dort 'CONTINUE benötigt? – Suparna

+0

Was macht 'playersInChunk()'? Veröffentlichen Sie den vollständigen Code. – user2004685

+0

@ user2004685 Aktualisierte den Beitrag. –

Antwort

0

Ohne die Geschäftslogik zu kennen oder den vollständigen Code zu sehen, wird es nicht einfach sein zu sagen, warum. Aber lassen Sie mich überlegen, was eine mögliche Ursache sein könnte:

Sie werden den Code nur nach der for-Schleife ausführen, wenn ein Player bereits in chunkListMap vorhanden ist. Und dieses Stück c ist, was Sie verwenden, um vorherigeSpieler abzurufen.

 List<Player> previousPlayers = chunkListMap.get(c); 

Jetzt auch Sie currentPlayers mit

 List<Player> currentPlayers = playersInChunk(c); 

Im Falle alle currentPlayers im spezifischen Chunk-Objekt vom Typ Spieler extrahieren, wird diese currentPlayers bedeuten und previousPlayers sind gleich.

Dann, wenn Sie tun:

 enteringPlayers.removeAll(previousPlayers); 

es alle Einträge aus dieser entfernt. Daher wirst du null sehen.

Die folgende schmutzig und rau Beispiel werden Sie, dass zeigen:

package collectionuse; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

class Entity{ 
    String name; 

    public void setName(String name){ 
     this.name = name; 
    } 
} 

class Chunk{ 
    Entity[] entity; 
    String name; 

    Chunk(){ 

    } 

    Chunk(String name){ 
     this.name = name; 
     entity = new Entity[2]; 
     Entity e1 = new Player(); 
     Entity e2 = new Player(); 
     e1.setName(name); 
     e2.setName("Dummy"); 
     entity[0] = e1; 
     entity[1] = e2; 
    } 

    public Entity[] getEntities() { 
     return entity; 
    } 
} 

class Player extends Entity{ 

} 

public class MapsT { 

    public void checkMap(){ 
     Map<Chunk, List<Player>> chunkListMap = new HashMap<>(); 
     List<Chunk> affectedChunks = new ArrayList<Chunk>(); 
     Chunk ch = new Chunk("Z"); 
     affectedChunks.add(0, ch); 
     affectedChunks.add(1, ch); 

     affectedChunks.add(2, new Chunk("A")); 
     affectedChunks.add(3, new Chunk("B")); 
     affectedChunks.add(4, new Chunk("C")); 
     affectedChunks.add(5, new Chunk("D")); 

     for (Chunk c : affectedChunks) { 
      List<Player> currentPlayers = playersInChunk(c); 
      if (!chunkListMap.containsKey(c)) { 
      chunkListMap.put(c, currentPlayers); 
      continue; 
     } 

     List<Player> previousPlayers = chunkListMap.get(c); 
     List<Player> enteringPlayers = new ArrayList<>(currentPlayers); 
     enteringPlayers.removeAll(previousPlayers); 
     //for (Player player : enteringPlayers) applyEffects(player); 

     List<Player> leavingPlayers = new ArrayList<>(previousPlayers); 
     leavingPlayers.removeAll(currentPlayers); 
     //for (Player player : leavingPlayers) unapplyEffects(player); 
     } 

    } 

    private List<Player> playersInChunk(Chunk c) { 
     List<Player> retVal = new ArrayList<>(); 
     for (Entity e : c.getEntities()) { 
      if (e instanceof Player) retVal.add((Player) e); 
     } 
     return retVal; 
    } 

    public static void main(String[] args) { 
     MapsT mapt = new MapsT(); 
     mapt.checkMap(); 
    } 

} 
+1

Aktuelle Spieler und frühere Spieler waren in der Tat die gleichen. Ich entschied mich dafür, mit einem völlig anderen Ansatz zu gehen, der prüft, wann ein Spieler sich bewegt und dann überprüft, ob der Spieler immer noch im Brocken ist. Wenn nicht, sind sie gegangen. Vielen Dank! –