试图在链接列表中显示所有匹配项

时间:2017-04-25 07:00:44

标签: java linked-list

目前我有这种销售方法,它检查用户输入的名称是否在链表中,如果是,它将从产品类调用销售功能。

private void sell() {
   int sellthis = -1;
   System.out.print("Name: ");
   String selloutput = In.nextLine();
   for (int y = 0; y < products.size(); y++){
     if (selloutput.equalsIgnoreCase(products.get(y).getName())){
        sellthis = y;
     }
    }
   if (sellthis < 0) {
       System.out.println("No such product");
    }
    else {

   System.out.println("Selling "+products.get(sellthis).getName());
   System.out.print("Number: ");
   int sellamount = In.nextInt();
   if (products.get(sellthis).has(sellamount)){
       cash.add(products.get(sellthis).sell(sellamount));
  }
  else {
    System.out.println("Not enough stock");
  }
}
}

现在我正在尝试修改它,以便如果用户输入Pen的值(不区分大小写),它会说“找到多个匹配项”,然后列出找到的匹配项。我知道我的卖方法似乎有点中世纪,抱歉:p

抱歉忘了添加该产品包含这些

public Product(String name, int stock, double price) {
    this.name = name;
    this.stock = stock;
    this.price = price;
}

我使用的产品如下

    products.add(new Product("Whiteboard Marker", 85, 1.50));
    products.add(new Product("Whiteboard Eraser", 45, 5.00));
    products.add(new Product("Black Pen", 100, 1.50));
    products.add(new Product("Red Pen", 100, 1.50));
    products.add(new Product("Blue Pen", 100, 1.50));

3 个答案:

答案 0 :(得分:2)

假设您的产品类看起来像这样:

public static class Product {

  private final String name;
  private final int stock;
  private final double price;

  public Product(String name, int stock, double price) {
    this.name = name;
    this.stock = stock;
    this.price = price;
  }

  public String getName() {
    return name;
  }
}

您可以使用以下代码查找匹配的产品并进行打印:

@Test
public void test() {
  List<Product> products = Arrays.asList(new Product("Pen", 10, 1.0),
                                       new Product("Super Pen", 10, 2.0),
                                       new Product("Something Else", 10, 1.0));
  String userInput = "Pen";
  List<Product> matchingProducts = products.stream()
                                         .filter(p -> p.getName().toLowerCase()
                                                       .contains(userInput.toLowerCase()))
                                         .collect(Collectors.toList());

  System.out.println("Multiple matched found:");
  matchingProducts.stream().forEach(p -> System.out.println(p.getName()));
}

当然这应该只是给你一个想法。你可以,例如从中提取出一种方法。

此代码使用Java 8 Streams过滤掉匹配的产品。

答案 1 :(得分:1)

要达到你的目标,你应该:

  1. 像在当前代码中一样测试相等性。
  2. 如果失败,请尝试使用contains方法查看它是否是部分匹配
  3. 如果1可以,那么如果2正常,则返回此产品,然后增加产品组合并将当前产品添加到产品候选列表中。

    for (int y = 0; y < products.size(); y++) {
            if (selloutput.equalsIgnoreCase(products.get(y).getName())) {
                sellthis += 1;
                candidates.add(products.get(y));
                break;
            }else if(products.get(y).getName().toUpperCase().contains(selloutput.toUpperCase())){
                sellthis += 1;
                candidates.add(products.get(y));
            }
        }
    

答案 2 :(得分:0)

您可以尝试在每个产品上使用String#matches(),以查看输入的片段是否为部分匹配。像这样:

System.out.print("Name: ");
List<Product> matches = new ArrayList<>();
String selloutput = In.nextLine().toLowerCase();
for (int y=0; y < products.size(); y++) {
    String product = products.get(y).getName().toLowerCase();
    String pattern = ".*" + selloutput + ".*";
    if (product.matches(pattern)) {
        matches.add(products.get(y));
    }
}