如何从List / ArrayList获取最大值
有一个存储整数值的ArrayList。 我需要find这个列表中的最大值。 例如,假设arrayList存储的值是: 10, 20, 30, 40, 50
最大值将是50
。
什么是find最大值的有效方法?
@编辑:我刚刚find一个我不太确定的解决scheme
ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(100); /* add(200), add(250) add(350) add(150) add(450)*/ Integer i = Collections.max(arrayList)
这将返回最高值。
比较每个值的另一种方法,例如selection sort or binaray sort algorithm
您可以使用Collections API
来实现您想要的function – 有效阅读 – 用于Collection.max的足够的Javadoc
Collections.max(arrayList);
根据指定的比较器返回给定集合的最大元素。
这个问题差不多一岁了,但是我发现如果你为对象创build一个自定义的比较器,你可以使用Collections.max作为对象的一个数组列表。
import java.util.Comparator; public class compPopulation implements Comparator<Country> { public int compare(Country a, Country b) { if (a.getPopulation() > b.getPopulation()) return -1; // highest value first if (a.getPopulation() == b.Population()) return 0; return 1; } } ArrayList<Country> X = new ArrayList<Country>(); // create some country objects and put in the list Country ZZ = Collections.max(X, new compPopulation());
public int getMax(ArrayList list){ int max = Integer.MIN_VALUE; for(int i=0; i<list.size(); i++){ if(list.get(i) > max){ max = list.get(i); } } return max; }
从我的理解,这基本上是Collections.max()所做的事情,尽pipe它们使用比较器,因为列表是通用的。
我们可以简单地使用Collections.max()
和Collections.min()
方法。
public class MaxList { public static void main(String[] args) { List l = new ArrayList(); l.add(1); l.add(2); l.add(3); l.add(4); l.add(5); System.out.println(Collections.max(l)); // 5 System.out.println(Collections.min(l)); // 1 } }
没有特别有效的方法来find未分类列表中的最大值 – 只需要检查它们并返回最高值。
在Java 8中,集合已经使用lambda进行了增强,因此查找max和min可以按如下方式完成。
码:
List<Integer> ints = Stream.of(12, 72, 54, 83, 51).collect(Collectors.toList()); System.out.println("the list: "); ints.forEach((i) -> { System.out.print(i + " "); }); System.out.println(""); Integer minNumber = ints.stream() .min(Comparator.comparing(i -> i)).get(); Integer maxNumber = ints.stream() .max(Comparator.comparing(i -> i)).get(); System.out.println("Min number is " + minNumber); System.out.println("Max number is " + maxNumber);
输出:
the list: 12 72 54 83 51 Min number is 12 Max number is 83
以下三种方法可以使用stream在列表中find最大值:
List<Integer> nums = Arrays.asList(-1, 2, 1, 7, 3); Optional<Integer> max1 = nums.stream().reduce(Integer::max); Optional<Integer> max2 = nums.stream().max(Comparator.naturalOrder()); OptionalInt max3 = nums.stream().mapToInt(p->p).max(); System.out.println("max1: " + max1.get() + ", max2: " + max2.get() + ", max3: " + max3.getAsInt());
所有这些方法就像Collections.max
一样遍历整个集合,因此它们需要的时间与集合的大小成正比。
Integer类实现了Comparable,因此我们可以很容易地获得Integer列表的最大值或最小值。
public int maxOfNumList() { List<Integer> numList = new ArrayList<>(); numList.add(1); numList.add(10); return Collections.max(numList); }
如果一个类没有实现Comparable,我们必须find最大值和最小值,那么我们必须编写自己的比较器。
List<MyObject> objList = new ArrayList<MyObject>(); objList.add(object1); objList.add(object2); objList.add(object3); MyObject maxObject = Collections.max(objList, new Comparator<MyObject>() { @Override public int compare(MyObject o1, MyObject o2) { if (o1.getValue() == o2.getValue()) { return 0; } else if (o1.getValue() > o2.getValue()) { return -1; } else if (o1.getValue() < o2.getValue()) { return 1; } return 0; } });
这是function
public int getIndexOfMax(ArrayList<Integer> arr){ int MaxVal = arr.get(0); // take first as MaxVal int indexOfMax = -1; //returns -1 if all elements are equal for (int i = 0; i < arr.size(); i++) { //if current is less then MaxVal if(arr.get(i) < MaxVal ){ MaxVal = arr.get(i); // put it in MaxVal indexOfMax = i; // put index of current Max } } return indexOfMax; }
package in.co.largestinarraylist; import java.util.ArrayList; import java.util.Scanner; public class LargestInArrayList { public static void main(String[] args) { int n; ArrayList<Integer> L = new ArrayList<Integer>(); int max; Scanner in = new Scanner(System.in); System.out.println("Enter Size of Array List"); n = in.nextInt(); System.out.println("Enter elements in Array List"); for (int i = 0; i < n; i++) { L.add(in.nextInt()); } max = L.get(0); for (int i = 0; i < L.size(); i++) { if (L.get(i) > max) { max = L.get(i); } } System.out.println("Max Element: " + max); in.close(); } }
取决于数组的大小,multithreading解决scheme也可能会加快速度