泛型和树集

时间:2011-02-01 18:38:02

标签: java generics treeset

使用泛型绝对是我的弱点,可以使用一些帮助。

该项目旨在开发一个简单的订单/库存系统,用于下订单,跟踪物料和库存,并记录自项目首次启动以来的所有库存和客户添加/删除。这需要读取和写入文件,我选择了CSV格式进行解析。有两个要解析的文件,一个用于Customers,另一个用于Items

我想使用TreeSet来添加/搜索log N,但是我的文件解析遇到了一些麻烦。我希望有一个单独的解析类在执行时接受集合和文件路径,并将文件处理成一组完整的对象,而不是两个类都有重复代码用于它们的对象类型,两者都有不同领域和方法。

我提出的唯一解决方案是TreeSet<? extends Object>,但这意味着我必须打包,然后将每个对象取消装箱,因为它在结构中被访问。

有更简单的方法吗?

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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;
}

答案 2 :(得分:0)

这是一个选项:

设计一个类来表示Inventory项目,并扩展或(更好地)实现解析接口。通过这种方式,您只需将Inventory对象插入树中即可。

,例如TreeSet<Inventory> tree = TreeSet<Inventory>() tree.add(库存对象)等

答案 3 :(得分:0)

猜猜你确实很困惑。

每个文件代表来自不同对象类型(客户和项目)的数据,因此它们的格式不同,其字段也不同。你不能用相同的代码解析它们。

  

我希望有一个解析类在执行时接受集合和文件路径,并将文件处理成一组完整的对象,这两个对象都有不同的字段和方法。

您可以拥有一个类,但是您需要使用不同的代码来读取这两种不同的文件类型。事实上,您希望填充一个通用的集合对象,以避免您以自己的方式处理每个文件类型。泛型仅用于为您节省一些手动转换,并避免意外将不需要的对象添加到集合中。

您可以在代码中执行以下操作:

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

你可以用较少的“自定义代码”方式来实现......一个嵌入式数据库可能......但如果你现在想做的话,你会学到新的方法来做同样的事情。