0

Genericsでの作業は間違いなく私の弱点であり、これについてはいくつかの助けを借りることができます。

このプロジェクトは、注文を出し、アイテムと在庫を追跡し、プログラムの開始以降のすべての在庫と顧客の追加/削除を記録する簡単な注文/在庫システムを開発することです。これにはファイルの読み取りと書き込みが必要であり、解析するCSV形式を選択しました。解析するファイルは2つあり、1つは用Customers、もう1つは用Itemsです。

TreeSetを使用して追加/検索ログNを作成したいのですが、ファイルの解析に問題があります。オブジェクトタイプに対して重複コードが機能する2つのクラスを用意するのではなく、実行時にセットとファイルパスを取得し、ファイルをオブジェクトの完全なセットに処理する単一の解析クラスが必要です。どちらも異なります。フィールドとメソッド。

私が思いついた唯一の解決策はですがTreeSet<? extends Object>、それは、構造内でアクセスされた各オブジェクトをボックス化してから、ボックス化解除する必要があることを意味します。

もっと簡単な方法はありますか?

4

4 に答える 4

4

階層がどのように見えるかの例を次に示します

class CVSParser<T> {
    private final RecordHandler<T> handler;

    public CVSParser<T>(RecordHandler<T> handler) {
       this.handler = handler;
    }

    public Set<T> parse(File f) {
        Set<T> records = new TreeSet<T>();
        for (String line : file ) {  //I'm paraphrasing here
           records.add(handler.parse( splitIntoFields(line) ));
        }
    }
}

interface RecordHandler<T> {
    public T parse(String[] fields);
}

class CustomerHandler implements RecordHandler<Customer> {
   public Customer parse(String[] fields) {
      return new Customer(fields[0], fields[1]);
   }
}

class ItemHandler implements RecordHandler<Item> {
   //...
}

Set<Item> items = new CVSParser<Item>(new ItemHandler()).parse(itemsFile);

または、ジェネリックをメソッドレベルにプッシュしCVSParserて静的にすることもできます。

class CVSParser {
     public static <T> Set<T> parse(RecordHandler<T> handler, File f) {
        //...        
     }
}


Set<Item> items = CVSParser.parse(new ItemHandler(), itemsFile);
于 2011-02-01T19:00:11.237 に答える
2

何方をお探しですか

interface CSVParseableObject {
   // routines
}

public class Customers implements CSVParseableObject{}
public class Items implements CSVParseableObject{}

その後

TreeSet<CSVParseableObject>

あなたが使用できる解析では、例えば、

Set<CSVParseableObject> parse(String path) {
    Set<CSVParseableObject> parseableObjects = new TreeSet<CSVParseableObject>();
    File file = new File(path);
    // parse ... 
    return parseableObjects;
}
于 2011-02-01T18:51:38.687 に答える
0

ここにオプションがあります:

Inventory アイテムを表すクラスを設計し、それを拡張するか、(より良い) 解析インターフェイスを実装します。このようにして、Inventory オブジェクトをツリーに簡単に挿入できます。

例: TreeSet<Inventory> tree = TreeSet<Inventory>() tree.add(Inventory Object) など

于 2011-02-01T18:53:08.650 に答える
0

あなたは確かに混乱していると思います。

各ファイルは、異なるオブジェクト タイプ (Customer と Items) のデータを表すため、フォーマットもフィールドも異なります。同じコードで両方を解析することはできません。

実行時にセットとファイル パスを取得し、ファイルを処理してオブジェクトの完全なセットにする単一の解析クラスを用意したいと考えています。どちらも異なるフィールドとメソッドを持っています。

単一のクラスを持つこともできますが、2 つの異なるファイル タイプを読み取るには別のコードが必要になります。各ファイル タイプを独自の方法で処理することを回避するために、一般的なコレクション オブジェクトを埋めたいというわけではありません。Generics は、手動でキャストする手間を省き、不要なオブジェクトをコレクションに誤って追加することを回避することのみを目的としています。

コードで次のようなことができます。

class MyParser {
    public Set<Customer> readCustomersFile(String path) {...}
    public Set<Item> readItemsFile(String path) {...}
}

「カスタムコード」の少ない方法でそれを行うこともできます...おそらく組み込みデータベース...しかし、それが今の方法である場合は、時間の経過とともに同じことを行う新しい方法を学ぶでしょう.

于 2011-02-01T18:55:56.720 に答える