在ArrayList <object>中找到最大对象字段

时间:2017-05-09 14:47:39

标签: java arraylist nullpointerexception

我有一个节点的ArrayList。 Node类的其中一个字段是level

我想找到列表中具有最高级别的节点级别。

这段代码给了我一个NullPointerException ...

private int findMaxLevel(ArrayList<Node> nodes)
{
    int level = 0;
    for(Node node : nodes)
    {
        if(node.getLevel() > level)
        {
            level = node.getLevel();
        }
    }
    return level;
}

我已尝试过此页面的多个实现:Sorting an ArrayList of Contacts based on name?但我没有找到解决方案。

编辑:

感谢您的建议,级别永远不会为null但我忘记在this.level = level类构造函数中添加Node ....

4 个答案:

答案 0 :(得分:0)

什么是空引用?例外情况如何? 无论如何,这段代码中唯一的引用是nodes所以我假设是它(getLevel()返回int类型,这是不可为空的) 也许你在创建它之前发送ArrayList<Node>?也许你正在某处使用这样的功能:

findMaxLevel(null);

ArrayList<Node> nodes = null; // Something like that
findMaxLevel(nodes);

答案 1 :(得分:0)

分开NPE ......

您可以在Node类中实现可比较,并使用Collections.max获取列表中的max元素。

int max = Collections.max(a);
System.out.println(max);

但为什么压倒可比:?

Collections.max()实现为:

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
    Iterator<? extends T> i = coll.iterator();
    T candidate = i.next();

    while (i.hasNext()) {
        T next = i.next();
        if (next.compareTo(candidate) > 0)
            candidate = next;
    }
    return candidate;
}

因此将调用compareTo来查找max element

答案 2 :(得分:0)

您可以使用stream api。我假设您的节点类有一个int字段level

 class Node {
            private int level;
            public int getLevel() {
                return  level;
            }
            public void setLevel(int level) {
                this.level = level;
            }
 }

现在我们需要在List Nodes中找出格言级别:

Optional<Integer> maxLevel = nodes.stream().filter(Objects::nonNull)
                .map(Node::getLevel).max(Comparator.<Integer>naturalOrder());

我希望这会有所帮助。

答案 3 :(得分:0)

使用这个单线条保持简单:

    Node max = nodes.stream()
                    .filter(Objects::nonNull)
                    .max((Node node, Node t1) -> t1.level < node.level ? 1 : -1)
                    .get();

确保先查看列表是否为空,或使用Optional,否则可能会收到NoSuchElementException。