web-dev-qa-db-ja.com

なぜ学校はリストよりも配列を教えるのですか?

私の学校での最初のプログラミングクラスの割り当てのほとんどで、配列を使用する必要がありました。今はフルタイムで働いており、これまで取り組んだプロジェクトにアレイを使用したことはありません。既存のプロジェクトでさえ、どこでも配列の使用を見たことはありません。私の意見では、 List の方が使いやすく、標準です。教授が学生に課題で配列を使用するように指示するのはなぜですか?学生が基本を理解するためだけのものですか?

ほとんどの大学がJavaを教えているため、この質問はJavaに固有のものです。

36
Howls Hagrid

配列はインデックス付けや境界などの概念を教えるため、コンピュータプログラミングにおける2つの基本的に重要な概念です。

リストはnotが「標準」です。配列が完全に適合するさまざまな問題空間があります。

119
Robert Harvey

彼らはおそらく、コンピューターがどのように機能するかを最も正確に表すデータ構造から始めることを望んでいたため、リストなどのより高いレベルの抽象化を導入して使いやすくする前に、基本に精通しています。そうしないと、特定の構造やアルゴリズムが一部の操作では遅い/速い理由を理解する方法がありません。コンピュータのメモリがリンクされたリストから実際に作成された場合、世界はまったく異なる場所になります。

同じ理由で、大学での最初のプログラミングクラスはCでしたが、残りのクラスはすべてC++、Javaおよびその他の言語でした。Cが何とか優れていたり簡単だったりするわけではありません。 、それはC(と配列)があなたから何も隠さないということです。

47
Ixrec

上記の答えは素晴らしいですが、私は別のことを考えています。 Javaのmain()メソッドは、学生が基本的な配列に非常に早い段階で遭遇することを意味します。多くの場合、クラスの初日です。どうして?

public static void main(String[] args)

これは、Hello World以降を書くために最初に対処しなければならないことです。 (最初はBlueJのようなIDEを使用して任意のメソッドを実行できるようにするコースをいくつか見ましたが、それらを脇に置いておきます...)いくつかのコースに手を振る価値があるかもしれませんがこれらのキーワードはしばらくの間、遅かれ早かれほとんどの教師が説明したいと思うでしょう。確かに、古典的な初心者レベルのテスト問題は、基本的なHello Worldプログラムの各キーワードの意味を生徒に尋ねることです。そして、メインのメソッドシグネチャの一部として何を見つけますか?配列(その理由の一部は履歴です。ArrayListはJava 1.0)には存在しませんでした。配列はその基本的な知識の一部です。リストは存在しません。

とは言っても、特にオブジェクトとその使用法がカバーされた後で、クラスがArrayListをコースの少し後で導入することはそれほど珍しいことではありません。 JavaのAPコンピュータサイエンスカリキュラムでさえ、ArrayListを含んでいます(以前は知っていて、Googleはまだそうしているようです)が、ArrayListがListと他のコレクションフレームワーク。

最後に、大学のCSプログラムでJavaをCSとプログラミングの概念を探究する手段として使用するのは、経験を積む方法ではなく、Java開発者になる方法です。一部のプログラムはプロの開発者の育成に重点を置いている場合もあれば、理論に重点を置いている場合もありますが、どちらの場合も、Javaを実際の業務で使用しない方法については、学ぶべきことがたくさんあります。ほとんどの大学のカリキュラムで教えられます。これはEffective Javaのようなデザインパターンやテクニックから、Spring、Hibernate、JUnitなどのフレームワーク、JSPやJDBCなどのより一般的なものまで多岐にわたります。より一般的に使用されるArrayListよりも配列を強調することは少し意味があります。

21
Zach Lipton

Javaでは、任意の型の変数を配列に格納できます。対照的に、ArrayListは参照の格納のみを許可します。したがって、オートボクシングがプリミティブを参照型に変換する方法、およびオートアンボクシングが参照型をプリミティブにときどき変換する方法を最初にカバーすることなく、ArrayListについて有益に説明できない場合があります。

for (int i=10; i<=10000; i*=10)
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    l.add(i);
    l.add(i);
    l.add(l.get(0));
    System.out.print("i=" + i);
    System.out.print(" #0==i:" + (l.get(0)==i));
    System.out.print(" #1==i:" + (l.get(1)==i));
    System.out.print(" #2==i:" + (l.get(2)==i));
    System.out.print(" #0=#1:" + (l.get(0)==l.get(1)));
    System.out.print(" #1=#2:" + (l.get(1)==l.get(2)));
    System.out.println(" #0=#2:" + (l.get(0)==l.get(2)));
}

コードがArrayListではなくint[3]を使用していた場合、驚くことはありません。 3つの要素はすべて、iと、また互いに比較されます。ただし、ArrayListを使用すると、リストの3つの要素はすべてiと常に比較され、最初と3番目の要素は常に互いに比較されますが、最初の2つの要素は、iが1、10、または100、ただし(ほとんどの実装では)iが1000または10000の場合はそうではありません。

7
supercat

ArrayListは配列を内部で使用するため、最初に配列の使用方法を教えることは理にかなっていると思います。 ArrayListクラスには、elementData配列であるObjectと呼ばれるメンバー変数があります。

JDKからArrayListソースコード

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;

ArrayListから要素を追加、更新、取得、または削除すると、この内部配列を使用してこれらの操作が実行されます。ユーザーIxrecがすでに指摘しているように、ArrayListは、通常はより扱いやすい、より高いレベルの抽象化です。

6
Derek W

あなたが言うように、リストが実際に操作しやすいと仮定すると、それは本当に重要ではありません。学習は、「簡単から難しい」というよりも、「基本から複雑」についてです。ファンダメンタルズが重要でなければ、コンピューターサイエンスは学術分野ではありません。オンラインチュートリアルから、既存のフレームワーク/ライブラリを使用してアプリをクリックする方法を学ぶことができます。 (もちろん、誰かがそれらのライブラリを作成する必要があります...そして誰かが最初にArrayListを実装する必要があります...)

3
Matthew Read

それは、アカデミック教育で最も重要なことは、正しい用語を使って自分のやっていることを説明することを教えることだからです。

リストはその配列とは別のものです。と使用できませんJava.util.List in Javaこれはインターフェースであるため、通常はJava.util.ArrayListこれはList実装であり、リストではなく、動的配列のオブジェクトラッパーです。つまり、「リスト」を使用すると言いますが、配列を使用します。

その用語の混乱をスキップし、単に配列を使用して学生に配列とは何かを学ぶのは非常に合理的です。 Javaで配列を使用する場合、少なくとも配列を使用します。

正直なところ、これはJavaでプログラミングを教えることが良い考えではない理由でもあります。プログラミングの基本的な概念を正しく学ぶのは難しいです。

2
Danubian Sailor

文字通りアレイを見たり、まったく使用したことはありませんか? に加えてリストを使用しています。通常はJavaを使用しませんが、明らかな類似点を引き出す他の多くの言語を使用しています。

配列とリストの間では、1つはより軽量で、さらに重要な点がありますが、もう1つはより多くの機能を備えています。プログラミングの一般的なルールとして、基本的にそれらの線に沿って分割される2つの類似したタイプがある場合、実際にはより洗練されたタイプが必要でない限り、より軽量なタイプを選択する必要があります。オーバーヘッドを削減することに加えて、これは実際にはプログラムの混乱と状態の量、特にそのコードのハンドルを維持するのに役立ちます。テスト中に問題が発生した場合、確認する場所が少なくなります。さらに重要なのは、配列とリストの場合、実際にそれを使用して何をしようとしているのかについての限られた範囲について、人々はより良​​い考えを得ます。

ええ、そうです、アカデミックな見地から、学生に基本を教える理由が追加されています。ただし、これは少し深くなります。配列とリストは、多くの場合、より軽量な型の基礎となるインスタンスの上に構築され、多くの場合、単にその周りをラップしている、かさばる型の良い例です。リストに基礎となる配列がない場合でも、リストは外側と同じように動作します。リストとは何かを誰かに教えることの一部は、配列とは何かを教えることです。

これはC++のような言語では手に負えなくなるかもしれません。配列は基本的にそれよりも細かく取り除くことはできませんが、より高水準の言語では、ほとんどそれ自体がリストです。それらが特定の状況で完全にニーズに合っている場合、なぜ他のものを使用する必要があるのですか?

1
Panzercrisis