2017-04-26 8 views
0

このようにコードを修正すれば、ユーザーからの入力に基づいて配列が作成されます。Javaジェネリックス(作業コードですが、あまり効率的ではありません)

引数[0] =配列型(INT、ダブル、文字列)

引数配列

の[1] =長さ:サンプル入力が "S 4 ABA、BAB BAAのAAB" のようなものであろう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

既に動作しているコードの改善に関するフィードバックをお探しの場合は、スタックオーバーフローが適切な場所ではありません。代わりに、姉妹サイト[コードレビュー](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

あなたはあなたのメインメソッドにパラメータを追加することを確かめます。 '>'となります。 (これは別のEです。私はおそらくそれを明確にしておくか、別のパラメータを使用すべきでした) – Chris

+0

私は嘘をつきました。私はそれを考え出した。ありがとう! –

関連する問題