如何优化两种类似的方法?

时间:2013-09-26 03:30:05

标签: java

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);
    }
}

3 个答案:

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

反之亦然。