0

Java 7 はラムダ式をサポートしていません。'GetMinOfList' と 'GetMaxOfList' の 2 つの同様のメソッドを最適化するにはどうすればよいですか?

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

3 に答える 3

4

コードが少ない?これらのメソッドを次のものに置き換えることができます。

 min = Collections.min(list); 
 max = Collections.max(list);

ただし、T が Comparable を実装していることを前提としています。Luiggi Mendoza が指摘しているように、コンパレーターを実装して、そうでない場合は、最小/最大の他の形式を介して使用することもできます。

 min = Collections.min(list, comparator); 
 max = Collections.max(list, comparator);
于 2013-09-26T03:36:22.063 に答える
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)
} 
于 2013-09-26T03:37:27.473 に答える
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
}

およびその逆。

于 2013-09-26T03:39:47.210 に答える