具有最大值的对象列表

时间:2014-12-19 16:07:50

标签: java max

考虑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的项添加到新列表中。

但每次我想要做类似的事情时,这都是很多代码,并且看起来效率不高。是否有更好的方法(无论是效率还是整洁)?

5 个答案:

答案 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;
  }
}