2

したがって、宿題の一部は、整数の文字列を取得し、それぞれをリストに入れることです。これが私が行ったことです。

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    String N;
    int count;        
    LinkedList<Integer> booksList = new LinkedList<>();


    System.out.printf("Give: ");
    N = input.nextLine();

    String[] arr = N.split(" ");        

    for (count = 0; count < arr.length - 2; count++) {            
        booksList.add(Integer.parseInt(arr[count + 2]));
    }

だから私がやったことは、文字列を取り、それを配列に分割してから、for ループで項目を取り、それらをリストに入れることです。私が混乱しているのは、次のように括弧内に「new」を指定して add コマンドを使用している人を見ていることです。

 booksList.add(new Integer.parseInt(arr[count + 2]));

これは私を混乱させており、これを正しい方法で行っているかどうかは完全にはわかりません. ちなみに、答えの最初の 2 つの要素は必要ありませんが、最初の 2 つの整数を 2 つの別々の変数に格納する必要があるため、count + 2 から配列要素を取得します。

また、私は何人かの人々がこれを書いているのを見ました:

List<Integer> booksList = new LinkedList<>();

それと私が書いたものと何か違いはありますか?

4

4 に答える 4

3

コンストラクト

List<Integer> booksList = new LinkedList<>();

主に2つの理由でよく見られます:

  • a)目的に最適なコレクションが何かわからない。配列、セット、リスト、ベクター、マップなど、多くの候補がありますが、特定のものを使用する必要があります。したがって、右側ではコンクリートである必要がありますが、左側では、できるだけ大きく開くようにします。

多くの場合、コレクションを繰り返し処理し、forループを使用し、検索、並べ替え、挿入、取得、削除を行います。

最初に考えた兄弟の方が適していることがわかった場合は、プログラムの残りの部分を書き直すことなく、後でRHSを変更できます。たとえば、LinkedListとArrayListのほとんどのメソッドは、定義された同じコントラクトを満たします。リスト内。

  • b)より広いオブジェクトを使用すると、外界との互換性が得られます。もちろん、Objectには.add(E)メソッドがないため、Objectほど曖昧なものを使用することはできません。

ただし、並べ替えや検索などには、リストが適しています。ドキュメントを見て、List、LinkedList、ArrayListを比較してください。コード内で1つを別のものに置き換えてみてください。

Linked〜とArrayListの2つの'sublist(int fromIndex、int toIndex)'メソッドが基本クラスで定義されており、同じように動作する可能性があります。

しかし、おそらくそれらは専門化されており、独自にsubListを実装しています。ここでは、インターフェイス<-クラスの関係があるため、インターフェイスには実装がなく、完全に抽象的であることがわかります。しかし、(抽象)基本クラス<-派生クラスの場合、パターンは同じです。派生/実装クラスは同じインターフェース'publicList sublist(int fromIndex、int toIndex)'を共有します。あなたはそれらが同じ結果を生み出すことを期待しますが、異なる方法で-多分。

LinkedListなどにのみ存在するメソッドを呼び出す必要がある場合にのみ、bookListをLinkedListとして事前に宣言するか、その目的でキャストします。

List<Integer> books = new LinkedList<>();
// ...
LinkedList <Integer> booksLiLi = (LinkedList <Integer>) books <> ();
// do something with booksLiLi which isn't defined on the List interface.

補足:コードは、最新の(7年前の)foreach-loopを使用して簡略化できます。

Scanner input = new Scanner (System.in);
LinkedList<Integer> booksList = new LinkedList<>();
System.out.printf ("Give: ");
String N = input.nextLine ();
String[] arr = answer.split (" ");        

for (String num: arr) {            
    booksList.add (Integer.parseInt (num));
}
bookList.remove ();
bookList.remove ();

ただし、スキャナーを宣言する場合は、スキャナーから直接整数を取得できます。

Scanner input = new Scanner (System.in);
LinkedList<Integer> booksList = new LinkedList<>();
System.out.printf ("Give: ");       

while (input.hasNextInt ()) {            
    booksList.add (input.nextInt ());
}
bookList.remove ();
bookList.remove ();

コメントへの反応として、3番目のコードがあります:System.in行から読み取り、その行にスキャナーを作成します。

    String line = input.nextLine (); 
    Scanner valueLine = new Scanner (line);
    List<Integer> books = new LinkedList<>();

    while (valueLine.hasNextInt ()) {            
        books.add (valueLine.nextInt ());
    }
于 2012-04-29T12:15:12.030 に答える
1

あなたのコードは問題ありません。

以下:

booksList.add(new Integer.parseInt(arr[count + 2]));

は構文的に正しくありませんが、あなたが持っているものはそうです。

List<Integer> booksList = ...vsに関してLinkedList<Integer> booksList = ...は、前者の方がややスタイルが良いと思います。ただし、後者を使用する必要がある場合もあります。違いは主に文体的なもので、今はあまり気にしません。

最後に、コメントで他の人が言ったことを繰り返したいと思います。変数は、最初に使用するときでなく、最初に使用するときに宣言します。また、変数を再利用しないでください。

于 2012-04-29T12:11:04.580 に答える
1

この関数 Integer.parseIntは a を返すので、 newキーワードnew Integerを使用する必要はありません。

実験を続け、コンパイル エラーを強調表示する Eclipse などの IDE を使用すると、すぐに言語を習得できます。それでも問題が解決しない場合は、オンライン チュートリアルを読むか、教授に相談してください。

于 2012-04-29T12:05:41.233 に答える
0

JavaのAListはインターフェースであり、そこからメソッドが特定の実装で定義されます。たとえばLinkedList、Listインターフェイスを実装し、独自のバージョンのadd、delete、およびその他のメソッドを作成します。ArrayListListインターフェースを実装するなど、他のデータ構造もあるため、これは非常に重要です。追加、削除、およびその他のメソッドは、とで動作が大きく異なりLinkedListますArrayList

あなたが書くとき

List<Integer> booksList = new LinkedList<>()

と同じように動作します

LinkedList<Integer> booksList = new LinkedList<>()

newキーワードはLinkedList名前にバインドされたオブジェクトを作成するためbooksListです。 booksList最初の例では、たまたまListオブジェクトであり、そこからLinkedList実装されます。

ドキュメントをチェックして、どのデータ構造がリストインターフェイスを実装しているかを確認してください。List<Integer> newList = new ....有効なコードがいくつもあることに驚かれることでしょう。

言及されていないことの1つは、データ構造を宣言するときに、すべての山かっこでジェネリック型を渡すことをお勧めします。

すなわちList<Integer> booksList = new LinkedList<Integer>()

于 2012-04-29T12:18:57.860 に答える