2013-09-26 39 views
0

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

*你的意思是什麼*優化*:更好的性能或更少的代碼? –

+0

我的意思是少代碼 – Alex

+4

哇。 。 。我從來沒有看到O(n^2)遞歸最小或最大函數。 。 。 – Aurand

回答

4

較少編號?您可以用這些方法替換這些方法:

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

儘管假設T實現了Comparable。作爲Luiggi門多薩所指出的:你也可以實現一個比較,並通過最小值/最大值的其他形式使用它,如果它不:

min = Collections.min(list, comparator); 
max = Collections.max(list, comparator); 
+0

也許你需要實現一個匿名的'Comparator '。不過,這是完成任務的較少代碼。 –

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

,反之亦然。