2017-04-25 31 views
0

目前我有這個銷售方法,它檢查用戶輸入的名稱是否在鏈接列表中,如果是,它將調用產品類中的銷售功能。試圖顯示鏈接列表中的所有匹配

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

我現在想修改它,如果用戶是輸入筆的值(不區分大小寫),它會說:「找到多個匹配」,然後列出找到的匹配。我知道我的賣法似乎有點中世紀,遺憾的是:對

對不起忘了補充一點,產品包含有這些

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

最新問題? – vlaxmi

+0

我將如何去修改銷售,以便如果用戶輸入產品名稱的一部分,它可以選擇該產品或顯示匹配產品名稱列表 – Dan

+0

我將產品添加到最新編輯 – Dan

回答

1

達到你的目標,你應該:

  1. 測試,正如你在當前的代碼做的平等。
  2. 如果失敗嘗試contains方法,看它是否是一個部分匹配

如果1 OK,然後退回本產品否則,如果2是OK,然後增加一個產品compteur並添加當前產品的產品候選名單。

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)); 
     } 
    } 
+0

後,試圖實現這一點,它適用於所有3筆,但是當我嘗試使用「白板」它立即接受第一個實例(白板標記)。我做錯了什麼? – Dan

+0

我編輯我的答案,因爲我的代碼有點奇怪;-) – Nemesis

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)); 
    } 
} 
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篩選出匹配的產品。

+0

作爲進一步的改進,你可以抽象出匹配的手段。這種方式可以共存多種方式來選擇產品 – dvberkel