考虑Item的对象列表,其中每个项目与整数字段相关联:
Item[0]->1
Item[1]->4
Item[2]->2
Item[3]->9
Item[4]->1
Item[5]->9
Item[6]->3
Item[7]->6
Item[8]->7
Item[9]->9
我想过滤掉包含具有最大值的项目的列表。在这种情况下,由于最大数量为9,我将收到{Item[3],Item[5],Item[9]}
。我这样做的方法是首先迭代整个列表,然后在某处存储最大值(9),然后再次迭代它,并将其字段等于9的项添加到新列表中。
但每次我想要做类似的事情时,这都是很多代码,并且看起来效率不高。是否有更好的方法(无论是效率还是整洁)?
答案 0 :(得分:5)
我可能一次性选择这些项目。
像这样的伪代码:
int max = Integer.MIN_VALUE;
Set<Item> maxItems = new LinkedHashSet<>();
for( Item item : items ) {
//if the item has a greater value clear the set and set the new max value
if( item.value > max ) {
maxItems.clear();
max = item.value;
}
//due to the code above value should always be <= max here, so we just need to check ==
if( item.value == max ) {
maxItems.add( item );
}
}
答案 1 :(得分:1)
我可以做这样的事情
List<Integer> maxValues = new ArrayList<Integer>();
int max = Integer.MIN_VALUE;
for(int i = 0; i < item.length; i++) {
if(item[i] > max) {
max = item[i];
maxValues = new ArrayList<Integer>();
}
if(item[i] == max) {
maxValues.add(i);
}
}
答案 2 :(得分:1)
最简单的方法是使用包含数字和索引列表的地图。
Map<int number, List<int index> >
在列表中迭代更新Maximum&amp;存储其索引。
- &GT;如果再次满足相同的最大值,也将其索引添加到列表中 - &GT;如果找到新的最大值,请更新地图中的数字。
答案 3 :(得分:0)
只是我心中的快速代码:
int max=Arrays.max(Item);
StringBuilder sb=new StringBuilder();
for(int i=0; i<Item.length; i++) {
if(Item[i]==max) {
s.append(i+",");
}
}
System.out.println(sb.toString());
如果这不起作用,请告诉我!
答案 4 :(得分:0)
使用Java 8可以在一行中完成很多工作:
List<Item> items = ... //The logic is the same with an array.
//Get the max value.
int max = items.stream().mapToInt(Item::getValue).max().getAsInt();
//Filter items which have this max value.
List<Item> result = items.stream()
.filter(item -> item.getValue() == max)
.collect(Collectors.toList());
注意:这是我的课程Item
public class Item {
private int value;
public Item(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}