泛型和树集

使用泛型绝对是我的弱点,可以使用一些帮助。 该项目旨在开发一个简单的订单/库存系统,用于下订单,跟踪物料和库存,并记录自项目首次启动以来的所有库存和客户添加/删除。这需要读取和写入文件,我选择了CSV格式进行解析。有两个要解析的文件,一个用于
Customers
,另一个用于
Items
。 我想使用TreeSet来添加/搜索log N,但是我的文件解析遇到了一些麻烦。我希望有一个单独的解析类在执行时接受集合和文件路径,并将文件处理成一组完整的对象,而不是两个类都有重复代码用于它们的对象类型,两者都有不同领域和方法。 我提出的唯一解决方案是
TreeSet<? extends Object>
,但这意味着我必须打包,然后将每个对象取消装箱,因为它在结构中被访问。 有没有更简单的方法?     
已邀请:
以下是您的层次结构的示例
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);
    
你在找吗?
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;
}
    
这是一个选项: 设计一个表示Inventory项目的类,并扩展或(更好地)实现您的解析接口。这样,您只需将Inventory对象插入树中即可。 例如,
TreeSet<Inventory> tree = TreeSet<Inventory>()
tree.add(库存对象)等     
猜猜你确实很困惑。 每个文件代表来自不同对象类型(客户和项目)的数据,因此它们的格式不同,其字段也不同。你不能用相同的代码解析它们。   我想让一个解析类接受执行中的集合和文件路径,并将文件处理成一组完整的对象,这两个对象都有不同的字段和方法。 您可以拥有一个类,但是您需要使用不同的代码来读取两种不同的文件类型。事实上,您希望填充一个通用的集合对象,以避免您以自己的方式处理每个文件类型。泛型仅用于为您节省一些手动转换,并避免将不需要的对象意外添加到集合中。 您可以在代码中执行以下操作:
class MyParser {
    public Set<Customer> readCustomersFile(String path) {...}
    public Set<Item> readItemsFile(String path) {...}
}
您可以使用较少的“自定义代码”方式来实现...嵌入式数据库可能......但如果您现在想要这样做,那么您将学习新的方法来做同样的事情。     

要回复问题请先登录注册