我有一个节点的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
....
答案 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。