2017-04-26 45 views
0

因此,這種可憎的代碼創建基於用戶輸入的數組。樣品輸入會是這樣的 「S 4 ABA BAB BAA AAB」 其中:Java泛型(工作代碼,但不漂亮..也不高效)

ARGS [0] =陣列型(中間體,雙,字符串)

ARGS [1] =陣列的長度

args [2 ...] =數組的內容

在我的代碼中創建數組是非常可怕的,但我不太確定如何在合併泛型時做到這一點。代碼的要點是能夠將創建的數組傳遞給底部的方法,因此是泛型。

感謝您提前提出任何意見!

import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashSet; 

public class ArrayGenerics<E> { 
    public static void main(String[] args) throws FileNotFoundException { 

    checkUsage(args); 

我的問題是在這裏: 我有迴路,以填補數組中,並呼籲在每個有條件的方法,這讓我覺得我能以這樣的方式,這是不是這樣反覆重寫此。

if (args[0].matches("I|i")) { 
     ArrayList<Integer> iL = new ArrayList<Integer>(); 
     for (int i = 2; i < args.length; i++) { 
      iL.add(Integer.parseInt(args[i])); 
     } 
     System.out.println("Original: " + iL); 
     System.out.println(" Unique: " + removeDuplicates(iL)); 
     shuffle(iL); 
     System.out.println("Shuffled: " + iL); 
     System.out.println(" Maximum: " + max(iL)); 

    } else if (args[0].matches("S|s")) { 
     ArrayList<String> sL = new ArrayList<String>(); 
     for (int i = 2; i < args.length; i++) { 
      sL.add(args[i]); 
     } 
     System.out.println("Original: " + sL); 
     System.out.println(" Unique: " + removeDuplicates(sL)); 
     shuffle(sL); 
     System.out.println("Shuffled: " + sL); 
     System.out.println(" Maximum: " + max(sL)); 
    } else { 
     ArrayList<Double> dL = new ArrayList<Double>(); 
     for (int i = 2; i < args.length; i++) { 
      dL.add(Double.parseDouble(args[i])); 
     } 
     System.out.println("Original: " + dL); 
     System.out.println(" Unique: " + removeDuplicates(dL)); 
     shuffle(dL); 
     System.out.println("Shuffled: " + dL); 
     System.out.println(" Maximum: " + max(dL)); 
    } 

} 

問題

public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) { 
    new HashSet<E>(list); 
    list = new ArrayList<E>(new HashSet<E>(list));    
    return list; 

} 

public static <E> void shuffle(ArrayList<E> list) { 
    Collections.shuffle(list); 
} 

public static <E extends Comparable<E>> E max(ArrayList<E> list) { 
    return Collections.max(list); 
} 

public static void checkUsage(String[] args) 
{ 
    if (args.length < 2) 
    { 
     System.out.println("Please supply more than 2 arguments"); 
     System.exit(1); 
    } 
    if (!(args[0]=="s") && (args[0]=="S") && 
     (args[0]=="d") && (args[0]=="D") && 
     (args[0]=="i") && (args[0]=="I")){ 
     System.out.println("Incorrect format of command."); 
     System.exit(1); 
    } 
} 
} 
+2

你的問題到底是什麼重刑? –

+0

每個條件使用提供的參數填充數組,並調用方法。我調用每個條件中的方法的事實使我認爲,我可以以某種方式配置代碼,以便在條件之後調用方法以避免重複代碼。我編輯了這篇文章,希望能更好地澄清它。 –

+1

如果您正在尋找關於改善已經運行的代碼的反饋,Stack Overflow不是適合它的地方。您應該將其提交給我們的姊妹網站[代碼評論](https://codereview.stackexchange.com/)。 –

回答

0

不是最佳應用守則結束,但如果你想代碼高爾夫這一點,你可以縮小它一點:

public static <E extends Comparable<E>> void main(String[] args) throws FileNotFoundException { 

    checkUsage(args); 

    ArrayList<E> array = new ArrayList<>(); 

    if (args[0].matches("I|i")) 
     for (int i = 2; i < args.length; i++) 
      array.add((E) new Integer(args[i])); 

    else if (args[0].matches("S|s")) 
     for (int i = 2; i < args.length; i++) 
       array.add((E) new String(args[i])); 
    else 
     for (int i = 2; i < args.length; i++) 
       array.add((E) new Double(args[i])); 


    System.out.println("Original: " + array); 
    System.out.println(" Unique: " + removeDuplicates(array)); 
    shuffle(array); 
    System.out.println("Shuffled: " + array); 
    System.out.println(" Maximum: " + max(array)); 

} 

或者效率更低......

public static <E extends Comparable<E>> void main(String[] args) throws FileNotFoundException { 

    checkUsage(args); 

    ArrayList<E> array = new ArrayList<>(); 

    for (int i = 2; i < args.length; i++) 
     if (args[0].matches("I|i")) 
      array.add((E) new Integer(args[i])); 
     else if (args[0].matches("S|s")) 
      array.add((E) new String(args[i])); 
     else if (args[0].matches("D|d")) 
      array.add((E) new Double(args[i])); 

    System.out.println("Original: " + array); 
    System.out.println(" Unique: " + removeDuplicates(array)); 
    shuffle(array); 
    System.out.println("Shuffled: " + array); 
    System.out.println(" Maximum: " + max(array)); 

} 
+0

我曾嘗試過類似之前的那種,並且遇到了問題。我把這段代碼放到了我的程序中,並再次得到了這個問題。用「ArrayList array = new ArrayList <>();」我得到「無法對非靜態類型E進行靜態引用」 –

+0

Mae確保將該參數添加到主方法中。 'E擴展Comparable ''。 (這是一個不同的E ..我可能應該澄清,或使用不同的參數) – Chris

+0

我撒謊。我想到了。謝謝! –