比较两个列表并对已添加和已删除条目进行排序

法赞·达图

我正在尝试比较两个列表,并已将条目添加到一个列表中,并删除了条目添加到另一个列表中。这是当前代码:

        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;
}

两个结果列表(enteringPlayers和leavingPlayers)始终为空。我究竟做错了什么?

苏帕那

在不了解业务逻辑或看不到完整代码的情况下,说出原因并非易事。但是,让我考虑一下可能是什么原因:

仅当chunkListMap中已经存在Player时,才将在for循环之后执行代码。那个块c是您用来检索previousPlayers的东西。

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

现在,您还可以通过以下方式提取currentPlayers

        List<Player> currentPlayers = playersInChunk(c);

如果特定Chunk对象中的所有currentPlayers均为Player类型,则这意味着currentPlayers和previousPlayers相同。

然后,如果您这样做:

        enteringPlayers.removeAll(previousPlayers);

它从中删除所有条目。因此,您将看到null。

以下肮脏而粗糙的示例将向您显示:

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();
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Java中实现可比较项的两个已排序列表之间的差异

来自分类Dev

显示两个修订之间已删除行的列表

来自分类Dev

通过使用linq比较两个列表进行排序?

来自分类Dev

检索两个列表,对值进行排序和比较,然后显示所有结果

来自分类Dev

合并两个已排序的链表

来自分类Dev

合并两个已排序的链表

来自分类Dev

查找比较两个巨大但已排序文件的行的有效方法

来自分类Dev

比较两个列表排序

来自分类Dev

比较两个列表排序

来自分类Dev

对两个列表进行排序

来自分类Dev

查找两个已排序向量之间的公共元素

来自分类Dev

您如何正确合并两个已排序的数组?

来自分类Dev

使用比较器基于两个元素在Java列表中进行嵌套排序

来自分类Dev

当任何两个元素之间的比较可能不明确时,对列表进行排序?

来自分类Dev

对数组排序与线性时间和恒定的空间在替换位置的两个已排序的序列

来自分类Dev

根据内部列表中的字段对Java中的两个嵌套列表进行排序和分组

来自分类Dev

比较两个文件而不进行AWK排序

来自分类Dev

如何比较两个属性然后进行排序

来自分类Dev

在比较两个列表之前排序

来自分类Dev

使用 Excel 2016 按第三个类别列表对两个费用列表进行排序和排序

来自分类Dev

c# 比较两个 List<T> 显示添加、删除和属性更改

来自分类Dev

inode 和已删除的文件条目

来自分类Dev

查找两个Excel文件之间的更改(新行,已删除行,已更新行)

来自分类Dev

Python 和 OpenCV:根据两个标准对轮廓列表进行排序

来自分类Dev

球拍-两个列表比较列表和值的问题

来自分类Dev

比较两个列表并使用powershell进行报告

来自分类Dev

将两个LinkedHashMaps与列表中的值进行比较

来自分类Dev

比较两个列表中的元素并添加不同的元素

来自分类Dev

使用Java中的可比较按两个字段升序和降序对对象列表进行排序

Related 相关文章

  1. 1

    在Java中实现可比较项的两个已排序列表之间的差异

  2. 2

    显示两个修订之间已删除行的列表

  3. 3

    通过使用linq比较两个列表进行排序?

  4. 4

    检索两个列表,对值进行排序和比较,然后显示所有结果

  5. 5

    合并两个已排序的链表

  6. 6

    合并两个已排序的链表

  7. 7

    查找比较两个巨大但已排序文件的行的有效方法

  8. 8

    比较两个列表排序

  9. 9

    比较两个列表排序

  10. 10

    对两个列表进行排序

  11. 11

    查找两个已排序向量之间的公共元素

  12. 12

    您如何正确合并两个已排序的数组?

  13. 13

    使用比较器基于两个元素在Java列表中进行嵌套排序

  14. 14

    当任何两个元素之间的比较可能不明确时,对列表进行排序?

  15. 15

    对数组排序与线性时间和恒定的空间在替换位置的两个已排序的序列

  16. 16

    根据内部列表中的字段对Java中的两个嵌套列表进行排序和分组

  17. 17

    比较两个文件而不进行AWK排序

  18. 18

    如何比较两个属性然后进行排序

  19. 19

    在比较两个列表之前排序

  20. 20

    使用 Excel 2016 按第三个类别列表对两个费用列表进行排序和排序

  21. 21

    c# 比较两个 List<T> 显示添加、删除和属性更改

  22. 22

    inode 和已删除的文件条目

  23. 23

    查找两个Excel文件之间的更改(新行,已删除行,已更新行)

  24. 24

    Python 和 OpenCV:根据两个标准对轮廓列表进行排序

  25. 25

    球拍-两个列表比较列表和值的问题

  26. 26

    比较两个列表并使用powershell进行报告

  27. 27

    将两个LinkedHashMaps与列表中的值进行比较

  28. 28

    比较两个列表中的元素并添加不同的元素

  29. 29

    使用Java中的可比较按两个字段升序和降序对对象列表进行排序

热门标签

归档