Java 泛型和树集

Java 泛型和树集,java,generics,treeset,Java,Generics,Treeset,使用泛型肯定是我的弱点,需要一些帮助 该项目旨在开发一个简单的订单/库存系统,用于下订单、跟踪项目和库存,并记录自计划首次启动以来的所有库存和客户添加/删除。这需要对文件进行读写,我选择了CSV格式进行解析。有两个文件需要解析,一个用于客户,另一个用于项目 我想使用树集添加/搜索日志N,但在文件解析方面遇到了一些问题。我希望有一个单独的解析类,在执行时接收集合和文件路径,并将文件处理成一个完整的对象集,这两个对象都有不同的字段和方法,而不是使用两个具有重复代码的类来处理它们的对象类型 我想出的唯

使用泛型肯定是我的弱点,需要一些帮助

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

我想使用树集添加/搜索日志N,但在文件解析方面遇到了一些问题。我希望有一个单独的解析类,在执行时接收集合和文件路径,并将文件处理成一个完整的对象集,这两个对象都有不同的字段和方法,而不是使用两个具有重复代码的类来处理它们的对象类型

我想出的唯一解决办法是
TreeSet你在找什么

interface CSVParseableObject {
   // routines
}

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

TreeSet<CSVParseableObject>
TreeSet
您可以在其中使用,例如

Set<CSVParseableObject> parse(String path) {
    Set<CSVParseableObject> parseableObjects = new TreeSet<CSVParseableObject>();
    File file = new File(path);
    // parse ... 
    return parseableObjects;
}
Set解析(字符串路径){
Set parseableObjects=new TreeSet();
文件=新文件(路径);
//解析。。。
返回可解析对象;
}
你在找什么

interface CSVParseableObject {
   // routines
}

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

TreeSet<CSVParseableObject>
TreeSet
您可以在其中使用,例如

Set<CSVParseableObject> parse(String path) {
    Set<CSVParseableObject> parseableObjects = new TreeSet<CSVParseableObject>();
    File file = new File(path);
    // parse ... 
    return parseableObjects;
}
Set解析(字符串路径){
Set parseableObjects=new TreeSet();
文件=新文件(路径);
//解析。。。
返回可解析对象;
}
这里有一个选项:

设计一个类来表示库存项,并让它扩展或(更好地)实现您的解析接口。通过这种方式,您可以简单地将Inventory对象插入到树中

例如,
TreeSet tree=TreeSet()
添加(库存对象)等。

这里有一个选项:

设计一个类来表示库存项,并让它扩展或(更好地)实现您的解析接口。通过这种方式,您可以简单地将Inventory对象插入到树中

例如,
TreeSet tree=TreeSet()

tree.add(库存对象)等。

我猜您确实很困惑

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

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

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

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

class MyParser {
    public Set<Customer> readCustomersFile(String path) {...}
    public Set<Item> readItemsFile(String path) {...}
}
类MyParser{
公共集ReadCustomerFile(字符串路径){…}
公共集readItemsFile(字符串路径){…}
}

你可以用一种更少的“自定义代码”方式来实现它。。。一个嵌入式数据库可能。。。但是,如果你现在希望这样做,那么随着时间的推移,你会学到处理同一件事情的新方法。

我猜你确实感到困惑了

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

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

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

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

class MyParser {
    public Set<Customer> readCustomersFile(String path) {...}
    public Set<Item> readItemsFile(String path) {...}
}
类MyParser{
公共集ReadCustomerFile(字符串路径){…}
公共集readItemsFile(字符串路径){…}
}

你可以用一种更少的“自定义代码”方式来实现它。。。一个嵌入式数据库可能。。。但是,如果你现在希望这样做,那么随着时间的推移,你将学会处理同一件事情的新方法。

下面是一个关于你的层次结构的示例

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);

下面是一个您的层次结构的示例

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);

在我看来泛型也是Java的弱点…所以,你想要一个泛型解析器类来解析客户和项目CSV文件?在我看来泛型也是Java的弱点…所以,你想要一个能解析客户和项目CSV文件的通用解析器类吗?这是一个非常优雅的答案。这就是为什么我选择它作为我的答案,因为即使我没有使用它,你肯定给了我一个hecuva回复!这是一个非常优雅的答案。这就是为什么我选择它作为我的答案,因为即使我没有使用它,你肯定给了我一个hecuva回答!