Java 查找ArrayList中对象字段的最大值<;对象>;

Java 查找ArrayList中对象字段的最大值<;对象>;,java,arraylist,nullpointerexception,Java,Arraylist,Nullpointerexception,我有一个节点的数组列表。节点类的一个字段是级别 我想找到列表中具有最大级别的节点的级别 int max = Collections.max(a); System.out.println(max); 这段代码给了我一个NullPointerException private int findMaxLevel(ArrayList<Node> nodes) { int level = 0; for(Node node : nodes) { if(n

我有一个节点的数组列表。
节点
类的一个字段是
级别

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

int max = Collections.max(a);
System.out.println(max);
这段代码给了我一个NullPointerException

private int findMaxLevel(ArrayList<Node> nodes)
{
    int level = 0;
    for(Node node : nodes)
    {
        if(node.getLevel() > level)
        {
            level = node.getLevel();
        }
    }
    return level;
}
private int findMaxLevel(ArrayList节点)
{
智力水平=0;
用于(节点:节点)
{
if(node.getLevel()>level)
{
level=node.getLevel();
}
}
回报水平;
}
我已经尝试了这个页面的几个实现:但是我没有找到解决方案

编辑:


感谢您的建议,级别不应为空,但我忘记在
节点
类构造函数中添加
this.level=level

什么是空引用?例外说明了什么? 无论如何,这段代码中唯一的引用是
节点
,因此我假设它就是(
getLevel()
返回
int
类型,该类型不可为null) 可能是在创建前发送了
ArrayList
?也许您在某处使用了这样的函数:

findMaxLevel(null);

ArrayList节点=null;//诸如此类
findMaxLevel(节点);

将NPE分开

您可以在Node类中实现Compariable,并使用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;
}

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

 class Node {
            private int level;
            public int getLevel() {
                return  level;
            }
            public void setLevel(int level) {
                this.level = level;
            }
 }
现在,我们需要在带有
节点的
列表中找出最大值:

Optional<Integer> maxLevel = nodes.stream().filter(Objects::nonNull)
                .map(Node::getLevel).max(Comparator.<Integer>naturalOrder());
可选maxLevel=nodes.stream().filter(对象::非空)
.map(Node::getLevel).max(Comparator.naturalOrder());

我希望这会有所帮助。

使用这一行代码可以让事情变得简单:

    Node max = nodes.stream()
                    .filter(Objects::nonNull)
                    .max((Node node, Node t1) -> t1.level < node.level ? 1 : -1)
                    .get();
Node max=nodes.stream()
.filter(对象::非空)
.max((节点,节点t1)->t1.level<节点.level?1:-1)
.get();

确保首先检查并查看列表是否为空或是否使用,否则您可能会得到NoSuchElementException。

您确定所有节点都分配了级别吗?显示
节点的实现以及给出错误的最小完整代码。您确定列表中的所有元素都不为空吗?@ΦXocę웃Пepeúpaツ. 你到底为什么要这么做?排序将把一个O(n)运算变成一个O(nlogn),我假设它可以是一个整数(因为没有显示任何代码)。重写
等于
不会定义顺序。您希望实现
compariable
以使
Collections.max()
工作!