Java 7不支持lambda表达式。如何优化两个类似的方法'GetMinOfList'和'GetMaxOfList'?
package com.example;
import java.util.ArrayList;
import java.util.List;
public class MinMax<T extends Comparable<T>> {
private List<T> lst = null;
public MinMax(List<T> com)
{
this.lst = com;
}
public Pair<T, T> GetMinMaxOfList()
{
return GetMinMaxOfList(this.lst);
}
private Pair<T, T> GetMinMaxOfList(List<T> list)
{
if(list == null || list.size() == 1)
return null;
//Pair<T, T> minMax = new Pair<T, T>();
T min, max;
if(list.size() == 2)
{
if(list.get(0).compareTo(list.get(1)) < 0)
{
min = list.get(0);
max = list.get(1);
return new Pair<T,T>(min, max);
}
}
//T sentry = list.get(0);
min = GetMinOfList(list);
max = GetMaxOfList(list);
return new Pair<T, T>(min, max);
}
private T GetMinOfList(List<T> littleList)
{
T sentry = littleList.get(0);
if(littleList.size() == 1)
return sentry;
List<T> nextLittle = new ArrayList<T>(1);
for(T t: littleList)
{
if(t.compareTo(sentry) < 0)
nextLittle.add(t);
}
if(nextLittle.size() == 0)
return sentry;
return GetMinOfList(nextLittle);
}
private T GetMaxOfList(List<T> lagerList)
{
T sentry = lagerList.get(0);
if(lagerList.size() == 1)
return sentry;
List<T> nextLarge = new ArrayList<T>(1);
for(T t: lagerList)
{
if(t.compareTo(sentry) > 0)
nextLarge.add(t);
}
if(nextLarge.size() == 0)
return sentry;
return GetMaxOfList(nextLarge);
}
}
答案 0 :(得分:4)
少代码?您可以使用以下方法替换这些方法:
min = Collections.min(list);
max = Collections.max(list);
虽然假设T实现了Comparable。正如Luiggi Mendoza所指出的那样:你也可以实现一个比较器并通过另一种形式的min / max来使用它,如果它没有:
min = Collections.min(list, comparator);
max = Collections.max(list, comparator);
答案 1 :(得分:1)
Java提供Collections.min(Comparables)和Collections.max(Comparables),您可以按如下方式实现。
private Pair<T, T> GetMinMaxOfList(List<T> list) {
return new Pair<T, T>(getMinOfList(list), getMaxOfList(list));
}
private T getMinOfList(List<T> list) {
return Collections.min(list)
}
private T getMaxOfList(List<T> list) {
return Collections.max(list)
}
答案 2 :(得分:1)
我认为你使用递归效率不高。这种类型的递归并耗尽了很多堆栈内存。此外,每次迭代都会触发另一个ArrayList创建。如果下一个元素大于/小于取决于您所在的函数,请尝试简单地循环遍历给定列表并设置局部变量
private T GetMaxOfList(List<T> littleList){
T smallest = null;
for(T element : littleList){
if(smallest == null){
smallest = element;
} else if (smallest.compareTo(element) > 0) {
smallest = element;
}
}
return smallest
}
反之亦然。