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()
工作!