java - 泛型和 TreeSet

标签 java generics treeset

使用泛型绝对是我的弱点,并且需要一些帮助。

该项目旨在开发一个简单的订单/库存系统,用于下订单、跟踪商品和库存,并记录自项目首次启动以来的所有库存和客户添加/删除。这需要读取和写入文件,我选择了 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);

关于java - 泛型和 TreeSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4866559/

相关文章:

c# - 通用列表/字典

python - 比较泛型类型对象的类型

tree - Java TreeSet 是如何实现的

java - 如何在不使用 LinearLayout 的情况下使用 Android 以编程方式为 Spinner 分配权重?

LDPC码的Java实现

java - 在 Spring JMS 消息中配置 JSON 输出

java - 在 Java 8 中实现 Monad

java - 是否有一种数据结构能够获取 N 个最大元素的集合,并用 Java 实现?

java - 在某些情况下,TreeSet Comparator 无法删除重复项?

Java:如何@SuppressWarnings 无法访问的代码?