0

私はJavaプログラムに取り組んでおり、メソッド内で(ファイルから)いくつかのベクトルを定義して埋めています。メソッドからすべてのベクトルの内容を返す必要があります。それらをすべて1つのオブジェクトに入れて返すことができると聞きました。それは可能ですか?そうでない場合、私にとって可能な解決策はありますか?よろしくお願いします。

コード スニペットを次に示します。

Object getInventory()
{       
        Vector<String> itemID=new Vector<String>();
        Vector<String> itemName=new Vector<String>();
        Vector<Integer> pOrdered=new Vector<Integer>();
        Vector<Integer> pInStore=new Vector<Integer>();
        Vector<Integer> pSold=new Vector<Integer>();
        Vector<Double> manufPrice=new Vector<Double>();
        Vector<Double> sellingPrice=new Vector<Double>();  
        Object inventoryItem=new Object(); //object to store vectors in

    try
    {
        Scanner infile= new Scanner(new FileReader("Ch10Ex16Data.txt"));

        int i=0;

        while (infile.hasNext())
        {                
            itemID.addElement(infile.next());                
            itemName.addElement(infile.next()+infile.nextLine());
            pOrdered.addElement(infile.nextInt());
            pInStore.addElement(pOrdered.elementAt(i));
            pSold.addElement(0);
            manufPrice.addElement(infile.nextDouble());
            sellingPrice.addElement(infile.nextDouble());
            i++;

        }
        infile.close();

        System.out.println(itemID);
        System.out.println(itemName);
        System.out.println(pOrdered);
        System.out.println(pInStore);  
        System.out.println(pSold);
        System.out.println(manufPrice);
        System.out.println(sellingPrice);

    }
    catch (Exception f)
    {
       System.out.print(f);
    }

     return inventoryItem;
}
4

8 に答える 8

9

個人的には、そのアプローチは完全に廃止します。Product クラスが必要なようです:

public class Product {

    private String itemName;
    private int itemID;
    // etc etc

    public Product(String itemName, int itemID) {
       this.itemName = itemName;
       this.itemID = itemID;
       // etc etc
     }

    public String getItemName() {
       return itemName;
    }

     public int getItemID() {
      return itemID;
    } 

    // etc etc
}

次に、次のようなもの:

public class Invertory {

 private List<Product> products = new ArrayList<Product>
 // etc etc

public Inventory(String fileName) throws IOException {
      // Load file,
       // Read each product, 
       products.add(new Product(...product arguments); //add to array
  }

  public Product[] getProducts() {
      return products.toArray(new Product[]{});
  }

}

于 2008-11-26T21:05:01.060 に答える
3

まず、Vector の代わりに ArrayList を使用します。次に、マップを戻りオブジェクトとして使用します。エントリの各値はリストの 1 つです。

次に、各フィールドを実際に保持するオブジェクトを作成し、これらのオブジェクトの java.util.List を返す方法がはるかに優れています。

public class Item
{
    String id;
    String name
    Integer pOrdered;        
    Integer inStore;
           :
           :
于 2008-11-26T21:03:21.080 に答える
2

あなたはいくつか間違ったことをしている。

まず、Vectorを使用しないでください。のように、これまで。順序付けが重要な場合は、APIにListを追加する必要があります(実装としてArrayListまたはLinkedListを使用することもできます)。

次に、多数の配列にたまたま整列する値を持たせようとしています。それを使用することはほぼ不可能になります。1つのレコードを表すクラスを作成し、それらのリストを返すだけです。

第三に、その例外をキャッチしないでください。あなたはそれをどうするかわからない、そしてあなたはただあなた自身を混乱させるだろう。エラーの場合に何をすべきか本当に良い考えがある場合にのみ例外をキャッチします(スタックなしでエラーメッセージを出力することは、決して正しいことではありません)。

メソッドのシグネチャは最も重要な部分です。それが正しければ、実装はそれほど重要ではありません。次のようなものを目指します。

List<Item> getInventory(File input) throws IOException {
}
于 2008-11-26T21:08:34.593 に答える
1

あなたは本当にここであなたのデザインを再考するべきです。複数のベクトルがあり、それぞれが同じタイプのもの、つまりインベントリ内のアイテムのプロパティを持っています。おそらく、これをInventoryItem名前や価格などのメンバーを持つ単一のクラスに変換する必要があります。次に、各アイテムを読み取るときに、指定さInventoryItemれたプロパティを使用してを作成し、単一のを返しVector<InventoryItem>ます。

これらすべての個々のを追跡することに本当に執着している場合は、持っているすべてのベクトルを含むVectoraを返すことができます。Vector[]

return new Vector[] { itemID, itemName, pOrdered, pInStore, pSold, manufPrice, sellingPrice };

また、ロビンが言うように、のArrayList代わりにコンテナを使用する必要がありVectorます。someVector.AddElement変更される唯一のことは、へのすべての呼び出しを変更する必要があるということですsomeList.add

于 2008-11-26T21:06:15.113 に答える
0

このように聞こえる場合は、「宿題」のタグを付ける必要があります。

さて、まず第一に、あなたはこれらすべてのベクトルを使用する必要がありますか、それともあなた自身の決定ですか?ArrayListsを使用する方が良いと指摘する人もいるかもしれませんが、私はそれらを廃止して、独自のItemクラスを作成します。

このように、概念アイテムのプロパティを複数のベクターに分散させる代わりに(現在の方法で)、アイテムごとに1つのアイテムインスタンスがあり、そのアイテムに関連するすべてのデータのフィールドがあります。これで、すべてのアイテムオブジェクトに必要なデータ構造(VectorまたはArrayList)は1つだけになり、getInventory()からその構造を返すことができます。

于 2008-11-26T21:06:29.513 に答える
0

オブジェクトを宣言する最も簡単な方法は、次のようなものです。

List<Vector<? extends Object>> inventoryItem = new ArrayList<Vector<? extends Object>>

ただし、これにはいくつかの問題があります。つまり、Javaのジェネリックが修正されていないため、返される各ベクトルの内容をテストしてキャストする必要があります。より良い解決策は、各ベクターをフィールドとして持つコンテナーオブジェクトを定義し、それらに追加することです。

しかし、これは本当に要点を欠いているように見えます。代わりに、7つのフィールドのそれぞれを持つInventoryItemを定義する必要があります。ファイルからオブジェクトを読み取るたびに、新しいInventoryItemをインスタンス化し、そのフィールドにデータを入力します。次に、これを単一のベクターに追加します。

また、一般的には、Vectorクラスを使用しないことをお勧めします。代わりに、ArrayListを使用する必要があります。Vectorは、同期プロパティが必要な場合にのみ実際に使用する必要があります。その場合でも、Collections.synchronizedList()で他のリストをラップすることを検討する必要があります。

最後に、例外だけをキャッチしたい場所を一方で数えることができます。あなたは本当にIOExceptionをキャッチしているはずであり、それでも単に再スローすることを検討したいかもしれません。また、System.out.println()ではなく、例外でprintStackTrace()を呼び出す必要があります。

于 2008-11-26T21:15:33.957 に答える
0

オブジェクトの外部でコレクションを渡すことは決して良い考えではないというのが、大まかな経験則です。それらはオブジェクトの内部では明らかに便利ですが、外部では制御できなくなり、明白ではありません。

コードを文書化するのではなく、コードを読みやすくするという原則を考慮してください。コレクションを取得する場合、呼び出し元に何を渡すかをどのように伝えますか? ジェネリックを使用しても、コレクションに何が起こるかを制御する方法はありません。コレクションが渡された後、誰かがコレクションに追加したり、別のスレッドから削除したりする可能性があります。

コレクションとそれらを操作するためのビジネス ロジックを含むビジネス クラスを作成しない理由はありません (ビジネス ロジックは常にあります。コレクションにアクセスする場所の周りにあるコピー アンド ペースト コードです)。 )。

以前は、JDK が常にコレクションではなく組み込み型の配列を使用しているように見えることに苛立ちを感じていましたが、コレクションを渡す (任意の基本型を渡すのと同じように) という考えに同意した後は、はるかに理にかなっています。あまり良い考えではありません。

于 2008-11-26T22:47:50.743 に答える
-1

一般的に、Vectorの代わりにList / ArrayListを使用するというアドバイスに心から同意しますが、その理由を知ることは重要です。確かに、私はVectorを「これまで」使用しないと言っているDustinに激しく反対しなければなりません。

Vectorは、本質的に同期されたArrayListです。本当に同期が必要な場合は、どうしても、Dustinの警告を無視して、Vectorを使用してください。

Vectorが正当化される別の例があります。そして、それは、Java2より前のコードベースとの互換性を維持する必要がある場合です。

于 2008-11-26T21:15:38.247 に答える