1

撞着語の一種である自助の助けを求めています。私自身の問題をもっと解決することで、どうすればいい人たちを悩ませることができますか?

私はJavaプログラミングの最後の週にいますが、Javaの学習には大きなハードルがあります。私はすべての本を読みましたが、私は小さな小さな問題に夢中になり続けています。それはトランプの家を建てようとするようなものです。私は本が示している構文の部分と使用法についてしか知りません。私が物事を組み合わせるとき、私は恐ろしいハードルに遭遇します。私はそれらを理解するために何時間もいじくり回そうとします。太陽のドキュメントは、役に立たないように見える基本的な使用法のみを示しています

これが私が欲しいものです:

何かを試しているときに、次の配列リストの操作のように機能しない場合は、arrayListにクラスインスタンスを追加するなどのサンプルコードを表示できる場所またはプログラムを見つけたいと思います。構文エラーごとに1つまたは2つの質問をすることなく、これについて簡潔に学ぶことができる場所はどこですか?Google for Javaはどこにありますか?あなたのエラーを取り、それらを修正する(または提案を提供する)方法をあなたに示すプログラムはありますか?

/tmp/jc_4083/Inventory.java:101: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;
                  ^
/tmp/jc_4083/Inventory.java:110: array required, but java.util.ArrayList found
            if (p != dvdlist[i]) {
                            ^
/tmp/jc_4083/Inventory.java:111: array required, but java.util.ArrayList found
                temp[i-adj] = dvdlist[i];
                                     ^
/tmp/jc_4083/Inventory.java:115: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;

誰かが私のためにそれを見ることに興味があるなら、これがこのクラスの私のコードです:

//Contruct inv and allow for methods add, get, size, sort, and value
import java.util.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class Inventory
{// class Inventory
    private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
    private int numDVDs;

    public Inventory()
    {// method Inventory
        dvdlist = new ArrayList<RatedDVD>();

    }// end method

    // add & get
    public RatedDVD get(int i){return dvdlist.get(i);}// method get

    public void add(DVD d){
    dvdlist = dvdlist d;
    sort();
    }// method add

    public double value()
    {// method value
        double total = 0.0;
        for (int i = 0; i < dvdlist.size(); i++) 
        {// for every pass thru dvdlist add total
        // [DEBUG] consider enhanced for
            total += get(i).feeValue();
        }
        return total;
    }// end method value

    public void sort()
    {// method sort
    // [DEBUG] consider optimization
    int n = dvdlist.size();
        for (int search = 1; search < n; search++) 
        {// for do the following and increment till dvdlist has been searched
            for (int i = 0; i < n-search; i++) 
            {// for step through comparison for entire dvdlist
                if (dvdlist.get(i).getName().compareToIgnoreCase(dvdlist.get(i+1).getName()) > 0) 
                {// if swap necessary then swap
                    RatedDVD temp = dvdlist.get(i);
                    dvdlist.set(i,dvdlist.get(i+1));
                    dvdlist.set(i+1,temp);
                }// end if swap
            }// end for compareto
        }// end outer for
    }// end method sort

    public int size(){return dvdlist.size();}// method size

    public void save() {
        save(true);
    }

    // save it to C:\data\inventory.dat
    public void save(boolean saveagain) {
        try {
            BufferedWriter w = new BufferedWriter(new FileWriter("c:\\data\\inventory.dat"));
            for (int i = 0; i < size(); i++) {
                RatedDVD dvd = get(i);
                w.write( dvd.getItem() + "\n");
                w.write( dvd.getName() + "\n");
                w.write( dvd.getRating() + "\n");
                w.write( dvd.getUnits() + "\n");
                w.write( dvd.getPrice() + "\n");
                w.write( dvd.value() + "\n");
                w.write( dvd.fee() + "\n");
                w.write( dvd.feeValue() + "\n");
                w.newLine();
            }
            // total value of it
            //w.write( value() + "\n");
            w.close();
        } catch (Exception ex) {
            if (saveagain) {
                new File("c:\\data\\").mkdir(); // make file if doesn't exist
                save(false); 
            }
        }
    }

    public int search(String name) {
        for (int i = 0; i < size(); i++) { // check if name string is equal
            if (get(i).getName().equalsIgnoreCase(name)) return i;
        }
        return -1; // we didn't find anything
    }

    // add a new dvd to the end, increasing the array size
    public void add(RatedDVD p) {
        RatedDVD[] temp = new RatedDVD[dvdlist.size()+1];
        for (int i = 0; i < dvdlist.size(); i++) {
            temp[i] = dvdlist[i];
        }
        temp[temp.length-1] = p; // add it at the end
        dvdlist = temp;
    }

    // remove a DVD from the array, and shrink the array size
    public void delete(RatedDVD p) {
        RatedDVD[] temp = new RatedDVD[dvdlist.size()-1];
        int adj = 0;
        for (int i = 0; i < dvdlist.size(); i++) {
            if (p != dvdlist[i]) {
                temp[i-adj] = dvdlist[i];
            }
            else adj = 1;
        }
        dvdlist = temp;
    }
    public int highestNumber() {
        int numb = 0;
        for (int i = 0; i < dvdlist.size(); i++) {
            if (get(i).getItem() > numb) {
                numb = get(i).getItem();
            }
        }
        return numb;
    }   
}// end class inventory
4

9 に答える 9

5

これdvdlistArrayListであり、Array ではなくCollectionインターフェースを実装します (ところで、これは「実装ではなくインターフェースへのプログラム」の原則として知られています。dvdlistとして宣言する必要がありますjava.util.List)。

private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD

Collection インターフェイスのメソッドを見てみると、要素の追加と削除に必要なものがすべて見つかります。

したがって、 a を追加するには、ここで行っているように、とにかく収まらないRatedDVD一時的な配列を使用する必要はありません。RatedDVDArrayList

// add a new dvd to the end, increasing the array size
public void add(RatedDVD p) {
    RatedDVD[] temp = new RatedDVD[dvdlist.size()+1];
    for (int i = 0; i < dvdlist.size(); i++) {
            temp[i] = dvdlist[i];
    }
    temp[temp.length-1] = p; // add it at the end
    dvdlist = temp;
}

代わりに、add(Object o)メソッド on を呼び出すだけdvdlistです。

RatedDVDインスタンスを削除するには、remove(Object o)メソッド on を使用しますdvdlist

search() メソッドについては、contains(Object o)onの使用を検討してdvdlistください。

コレクションを反復処理する必要がある場合は、Iteratorを使用します。

for (Iterator iter = dvdlist.iterator(); iter.hasNext();) {
   RatedDVD ratedDVD = (RatedDVD) iter.next();
   //rest of the code block removed
}

または、Java 5+ と Generics を使用するとさらに高速になります。

for (RatedDVD ratedDVD : dvdlist) {
   // rest of the code here
}

本当に、Collection Frameworkを掘り下げる必要があります。

于 2009-09-09T22:56:26.083 に答える
3

コンパイラのエラーは、あなたが間違っていることをかなり説明しているように見えますが、それを正しく行う方法について混乱している理由はわかります。ArrayListの使用方法を誤解しているようです。ドキュメントを見ると、メソッドがadd()ありremove()、作成した操作add()とメソッドを実行していることがわかりますdelete()。ArrayListを生の配列であるかのように処理しようとしています。そうしないでください。APIが提供するメソッドを使用します。これにより、エラーが解決されるだけでなく、将来のプログラマーにとってコードがよりクリーンで明確になります。

于 2009-09-09T22:34:02.600 に答える
2

実際、コンパイラ エラーは非常に明確です。

/tmp/jc_4083/Inventory.java:101: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;

「互換性のない型」と表示され、 が期待されていましたjava.util.ArrayListが、代わりに が見つかりましたRatedDVD[]

あなたの問題は、Python のような言語とは異なり、Java がリストと配列を同じように扱わないことです。それらはまったく異なるものです。配列は特別な言語レベルの構成要素ですが、配列はArrayList他のクラスと同じです。

したがって、配列を型リストの変数に割り当てることはできません。プログラム全体でこれら 2 つの型のいずれかのみを使用するか、または や などの方法を使用して手動で変換する必要がjava.util.Arrays.asList()ありList.toArray()ます。

あなたはあまりにも高度なことを急いでやろうとしているようです - おそらく最初に Sun のJava チュートリアルを見るべきです- ただし、それらは非常に包括的であり、言語の詳細を調べるためのリファレンスとしても使用できます. コレクションと配列の間の変換に関するセクションもあります。

于 2009-09-09T22:34:15.947 に答える
1

コンパイラ エラーを解決するには、通常、最初のエラーから始めて、最初に修正することをお勧めします。それを修正した後、残りのコンパイラ エラーも解決されるか、別の種類のエラーである可能性があります。

コンパイラ エラーが何を意味するのかを理解するために、Java のコンパイルおよびランタイム エラー(PDF) という記事があります。この記事では、さまざまな種類のエラー メッセージについて説明し、エラー メッセージの原因となるコードの種類の例を示します。実行時エラー メッセージについては、Java Glossary に非常に多くのリストがあります。また、コンパイル時のエラー メッセージのリストもあります。

于 2009-09-09T22:51:26.053 に答える
1

IDE (Eclipse など、完全に無料) を使用することをお勧めします。入力時に提案を行うことで API 構文を理解するのに役立ち、入力時にエラーが表示されるため、正確な構文エラーを特定して質問することができます。質問に関しては、それがStackOverflowの目的です。

他の人があなたの特定の構文の質問に私を打ち負かしたので、私はあなたがどのように助けを得るかという一般的な質問に私の答えを限定しています.

于 2009-09-09T22:38:44.950 に答える
0

オブジェクト指向で考えてみてください...

何か (おそらく授業) があなたをオブジェクト指向プログラムの作成に駆り立てたように見えますが、それらの用語で考える必要があることをまだ受け入れていない可能性があります。

Java ではほとんどのものはオブジェクトですが、Java はプリミティブ型と両方の配列をサポートしています。Java では、フラットで手続き型の変更可能な方法でプログラミングすることができますが、オブジェクト指向の機能的な方法で記述することもできます。両方を行って混乱する可能性がありますが、それはあなたが今いる場所かもしれません.

2 つのスタイルを混在させようとしています。これは常に悪いことではありませんが、授業では、インストラクターがオブジェクトのプライベートな内部実装でない限り、より多くのオブジェクトとより少ない配列を表示することをファームに安全に賭けることができます。

したがって、データ構造をメソッドを備えたブラック ボックスと考えて、自分でどのように実装しているかを確認してください。

あなたはおそらくここにいるでしょうが、これらは ArrayList でできることです。そして、ArrayList<RatedDVD>それでできることをさらに制限する があります。最初にこれを理解してから、プログラムを修正して、ArrayList オブジェクトで使用可能な操作を処理してください。

于 2009-09-09T22:53:06.400 に答える
0

したがって、ここでの問題は、配列のような ArrayList にアクセスしようとしているということです。Java はそのようなことをしないため、これは正しくありません。配列の i 番目の要素を取得するには、list.get(i) を使用する必要があります。同様に、ArrayList 変数を配列に設定しようとすると、コンパイラに怒られます。temp の内容で新しい ArrayList を作成し、dvdlist をそれに設定する必要があります。dvdlist = new ArrayList<RatedDVD>(temp);.

引き続き発生する問題については、Java API に含まれるすべてのクラスの基本的な使用方法を説明する JavaのAPI 仕様があります。たとえば、ArrayListは、使用する必要のある特定のメソッドとコンストラクターを持つジェネリック コレクションです。Java には演算子のオーバーロードがないため、配列構文を使用して List 内の要素にアクセスすることはできません。また、配列は独自のデータ型であるため、単に ArrayList を配列として扱うことはできず、その逆も同様です。

于 2009-09-09T22:35:51.850 に答える
0

配列と ArrayList の違いについて混乱しているようです。配列は要素の静的リストであり、[] 記号を使用して構築されます。ArrayList は Java の Collections システム内のオブジェクトで、サイズ変更可能な配列のように機能します。つまり、インデックスを付けたり、追加したり、挿入したりできます。これらは交換できません。

これが初めてのプログラミング経験である場合、あなたは一人ではありません。多くのコンパイラ エラーは役に立ちません。私が何年にもわたる試行錯誤の中で学んだことをあなたに与えることができる1つの提案 - 小さく始めて積み上げてください。コンパイルするメイン メソッドを取得します。次に、最初の小さなピースを追加します (たとえば、クラスを作成します)。次に、次のピースを追加します。実行しながらテストしてください。特定のコンパイラ エラーについてはググることができます。発見した内容には驚かされました。それ以上に、多くは試行錯誤です。これらは経験から学ぶものであり、「ベテラン」のスピードの多くは、失敗する可能性があることを何度も何度も見てきた長い経験から来ています。生まれつきの知能の一種。

于 2009-09-09T22:36:23.273 に答える
0

初心者のプログラマーが抱えていると思われる最大の問題の 1 つは、エラー メッセージを十分に読み取って解釈できないことです。

javac(または任意のコンパイラ/インタープリター) が提供するエラーを注意深く調べることで、十分に役立つでしょう。コード内で理解しているいくつかの間違い (つまり、間違った型付きの値を変数に代入する、境界を超えてループを拡張する) から始めて、コンパイラがこれらをどのように処理するかを確認することもできます。

于 2009-09-09T22:42:23.870 に答える