如何在ArrayList中通过字符串查询Product对象并返回Product数组
补全并优化产品查询方法
看起来你已经搭好了查询方法的基本框架——先统计匹配产品的数量,再创建对应长度的数组来存放结果,只是第二个遍历的代码没写完对吧?我来帮你补全并给出更简洁的实现方案:
补全你原有思路的代码
按照你一开始的写法,只需要把第二个遍历逻辑补全,将匹配的产品存入目标数组即可:
public Product [] findProducts(Lookup query) { int count = 0; // 先遍历统计匹配产品的数量 for (int i = 0; i < this.nextProduct; ++i) { if (query.matches(this.products[i])) { ++count; } } Product [] selected = new Product[count]; count = 0; // 补全第二个循环:遍历收集匹配的产品到目标数组 for (int i = 0; i < this.nextProduct; ++i) { if (query.matches(this.products[i])) { selected[count++] = this.products[i]; } } return selected; }
更简洁的优化实现
其实不用手动统计数量再二次遍历,直接用ArrayList先收集所有匹配的产品,最后转成数组即可,代码可读性更高:
public Product[] findProducts(Lookup query) { List<Product> matchedProducts = new ArrayList<>(); // 直接遍历存储Product的ArrayList for (Product product : productsList) { if (query.matches(product)) { matchedProducts.add(product); } } // 将List转成Product数组,传入new Product[0]会自动适配长度 return matchedProducts.toArray(new Product[0]); }
补充Lookup类的matches方法实现
你的代码里用到了query.matches(product),这里需要确保Lookup类的matches方法正确实现按name和id匹配的逻辑,比如支持“模糊匹配部分字段”(如果查询字段为null则忽略该条件):
public class Lookup { private String name; private String id; // 构造器、Getter方法 public Lookup(String name, String id) { this.name = name; this.id = id; } public boolean matches(Product product) { // 如果查询的name不为空,则必须匹配产品name;为空则跳过该条件 boolean nameMatch = (name == null || name.equalsIgnoreCase(product.getName())); // 同理处理id匹配 boolean idMatch = (id == null || id.equals(product.getId())); // 同时满足name和id的匹配条件(如果有指定的话) return nameMatch && idMatch; } }
这样你的查询方法就能根据传入的Lookup对象,精准匹配产品的name和id,返回符合条件的产品数组了。
内容的提问来源于stack exchange,提问作者user9170437
相关产品推荐
相关产品推荐

