2015-05-02 101 views
0

所以我對週二考試算法與數據但我不能從過去的紙解決這個問題。找到一個比較大的數組元素在Java中

收件稱爲最大Java靜態方法這需要對象的數組和一個 比較對象,它可以訂購該數組元素類型的對象,並從該陣列返回 取其元件根據由給定的順序是最大 比較對象。你可以假設數組的長度爲至少1.您的代碼必須使用沒有方法從Java的API以外的方法從類型Comparator.Your方法比較必須是通用的,所以陣列可以有任何非基本元素類型。

我嘗試:

public static void greatest(Object[] a, Comparator<Object> x) { 
     for (int i = 0; i < a.length; i++) { 
      x.compare(a[i], a[i+1])); 
     } 
    } 

但你很可能會看到我很無知,我敢肯定,我的嘗試是錯誤的!任何幫助都會很棒。我看過比較器的在線,但它們看起來只是針對特定的數據類型,而這是針對任何非基本元素類型的。

+0

你能寫下來的僞代碼的「最大」的算法? – isnot2bad

+0

只從算法開始。嘗試在int數組中找到最大的int值。你需要一個變量來保存最大的int值。然後將相同的算法應用於可比對象的數組。 –

+0

坦率地說,我不明白爲什麼你的老師要求你處理泛型類型,如果你不掌握變量,循環和基本算法,這是一個相當先進和複雜的問題。這對目前的水平來說太複雜了。 –

回答

0

你的方法應該是通用的,並返回結果。 這裏是解決方案的一部分,你只需要添加一些東西,使之完整。

public static <T> T greatest(T[] a, Comparator<? super T> comp) { 
    T greatest = a[0]; 
    for(int i = 1; i < a.length; i++) { 
    } 
    return greatest; 
} 
+0

您應該對'Comparator'的類型參數使用有界通配符,因此也接受超類型'T'的比較器。 – isnot2bad

+0

對,我糾正了這一點。 – SpiderPig

1

Compare<T>是一個通用的接口,由參數<T>所見。 T可以是任何類。由於以下方法採用Comparator<T>類型的參數,因此可以使用任何實現此接口的比較器。

注意,數組保存T類型的對象。這是必要的,因爲Comparator只知道如何比較這種類型的對象。

public static <T> T greatest(T[] a, Comparator<? super T> x) { 
    T greatest = a[0]; 
    for (int i = 1; i < a.length; i++) { 
     if (x.compare(a[i], greatest) > 0) { 
      greatest = a[i]; 
     } 
    } 
    return greatest; 
} 
+0

差不多。類型參數'T'沒有聲明,並且該方法還沒有返回類型。 – isnot2bad

+0

啊,我的不好。我忘了在複製他的方法後添加它。 –

+1

改進:使用'Comparator ',以便任何比較器能夠比較類型爲'T'的對象或任何超類型的'T'被接受。 – isnot2bad

1
  1. 初始化當前最大與所述第一元件的[0]
  2. 迭代陣列上方,並且如果當前元素是大於最大比較具有最大
  3. 當前元素,它是新的最大
  4. 回報最大
0

的方法必須是通用(文中「對象」是用來missleading)。它還需要返回結果(在這種情況下是輸入類型的對象,但某些解決方案可能會返回對象的索引)。

那麼函數的聲明看起來像:

public static <T> T greatest(T[] objects, Comparator<T> comparator) 

然後你需要找到最大的一個。這只是通過記住迄今爲止見過的最大的一個而完成的。只要元素較大,請記住新元素:

{ 
    assert objects.length >= 1; 
    T pivot = objects[0]; // assume the first is biggest 
    for(T o : objects) // no good way to start with second 
    { 
     if (comp.compare(o, pivot) > 0) // if o is bigger 
      pivot = o; 
    } 
    return pivot; 
} 

該代碼未編譯且未經測試。

0

試試這個:

public static T greatest(T[] a, Comparator<T> x) { 
    T temp = a[0]; 
    for (int i = 0; i < a.length;i++) { 
     if (x.compare(temp,a[i]) <= 0) { 
      temp = a[i]; 
     } 
    } 
    return temp; 
} 
+0

我認爲OP的方法聲明很重要。該方法應該是通用的。 – isnot2bad

+0

爲什麼被拒絕投票?這是不是完成了同樣的事情? –

+0

然後將對象改爲T. Simple。地獄,你可以編輯答案isnot2bad! –