2016-05-16 3 views
0

nicht wirklich verstehen, wie zwei Arrays

/* 
 
* To change this license header, choose License Headers in Project Properties. 
 
* To change this template file, choose Tools | Templates 
 
* and open the template in the editor. 
 
*/ 
 
package order; 
 
import java.util.Arrays; 
 
/** 
 
* 
 
* @author Alexander 
 
*/ 
 
public class Order { 
 
    private static String[] products = {"Compass", "Eraser", "Pen", "Pencil","Pencil Case", "Pencil Sharpener", "Ruler", "Scissors"}; 
 
    private static double[] prices = {4.5, 0.5, 0.3, 0.6, 10, 0.3, 1.2, 2.5}; 
 
    public static int orderNum = 0; // 
 
    private String productName ; 
 
    private double price; 
 
    private int discount; 
 
    private final int minDiscount = 0; 
 
    private final int maxDiscount = 50; 
 
    private int quantity; 
 
    private final int minQuantity = 0; 
 
    private final int maxQuantity = 1000; 
 
    private double total; 
 
    private String message; 
 
    private boolean isDiscounted = false; 
 
    private boolean isValidOrder = true; 
 
    
 
    public Order(){ 
 
     isValidOrder = false; 
 
     message = "**ERROR** : Order number cannot be totalled as no details have been supplied."; 
 
     orderNum++; 
 
     } 
 
    public Order (String productName, int quantity) { 
 
      this.quantity = quantity; 
 
      this.productName = productName; 
 
      testQuantity(quantity); 
 
      if (isValidOrder = true){ 
 
       calculate(); 
 
      } 
 
      orderNum++; 
 
     } 
 
    public Order (String productName, int quantity, int discount) { 
 
     this.productName = productName; 
 
     this.quantity = quantity; 
 
     this.discount = discount; 
 
     testQuantity(quantity); 
 
     testDiscount(discount); 
 
     getPrice(productName); 
 
     if (isValidOrder = true){ 
 
       calculate(); 
 
      } 
 
      orderNum++;   
 
    } 
 
    public String getOrderDetails(){ 
 
     if(isValidOrder == true && isDiscounted == true){ 
 
      message = "Order Number: " + orderNum + "\n" + "Product Name: " + productName + "\n" + "Product Price: $" + price + "\n" + "Order Quantity: " + quantity + "\n" + "Discount: " + discount + "%" + "\n" + "Total Price: $" + total; 
 
     } 
 
     else if(isValidOrder == true && isDiscounted == false){ 
 
      message = "Order Number: " + orderNum + "\n" + "Product Name: " + productName + "\n" + "Product Price: $" + price + "\n" + "Order Quantity: " + quantity + "\n" + "Total Price: $" + total; 
 
     } 
 
     return message; 
 
    } 
 

 
     private void getPrice(String pce) { 
 
      Arrays.sort(products); 
 
      int searchProductArray = Arrays.binarySearch(products, pce); 
 
      if (searchProductArray >= 0) { 
 
      price = prices[searchProductArray]; 
 
      productName = products [searchProductArray]; 
 
      isValidOrder = true; 
 
      } 
 
      else { 
 
      price = 0.0; 
 
      isValidOrder = false; 
 
      message = "**ERROR**: Invalid product name"; 
 
      } 
 
     } 
 
    
 
     public void calculate(){ 
 
      if (isDiscounted == false){ 
 
      total = quantity * price; 
 
      } 
 
      else { 
 
       total = quantity * price - quantity * price * (discount/10); 
 
       } 
 
     } 
 
    
 
     public void testQuantity(int quantity){ 
 
       boolean isValidOrder = true; 
 
       if (quantity <= minQuantity) { 
 
        message = "**ERROR**: Invalid quantity. Quantity cannot be 0 or less"; 
 
        isValidOrder = false; 
 
       } 
 
       else if (quantity > maxQuantity) { 
 
        message = "**ERROR**: Invalid quantity. Quantity cannot be greater than 1000"; 
 
        isValidOrder = false; 
 
       } 
 
       else { 
 
        this.quantity = quantity; 
 
        this.isValidOrder = true; 
 
       } 
 
     } 
 

 
     public void testDiscount (int discount) { 
 
       boolean isDiscounted = false; 
 
       if (discount <= minDiscount) { 
 
        message = "**ERROR**: The discount rate cannot be lower than or equal to 0"; 
 
        isDiscounted = false; 
 
       } 
 
       else if (discount > maxDiscount) { 
 
        message = "**ERROR**: The discount rate cannot be greater than 50"; 
 
        isValidOrder = false; 
 
       } 
 
       else { 
 
        this.discount = discount; 
 
        this.isDiscounted = true; 
 
        this.isValidOrder = true; 
 
       } 
 
     } 
 
     
 
    
 
     
 
    /** 
 
    * @param args the command line arguments 
 
    */ 
 
    public static void main(String[] args) { 
 
     Order O1 = new Order(); 
 
     O1.getPrice("Compass"); 
 
      
 
     System.out.println(O1.getOrderDetails()); 
 
    } 
 
} 
 

 

Die getPrice Methode anzupassen ist ein Parameter zu erhalten: Produktname. Die Methode besteht darin, valNeed zuzuweisen, um zwei Arrays zu verwenden. Ein Array namens Produkte enthält die Liste der Produktnamen. Das andere Array namens Preise soll den Preis für dieses Produkt halten. Die Indexpositionen sollten übereinstimmen. Sie müssen die Indexposition von productName innerhalb des articles-Arrays mithilfe der binarySearch-Methode ermitteln. Sobald Sie diese Position haben, müssen Sie dann den Preis aus dem Preis-Array mit dieser Indexposition zuweisen.

Dies ist, was ich bisher habe, aber ich bin mir nicht ganz sicher, ob es korrekt ist.

+0

http://stackoverflow.com/help/mcve. Wenn das Problem die getPrice-Funktion ist, zeigen Sie einfach diesen Code und den zugehörigen Code an. Außerdem kann der von Ihnen bereitgestellte Code nicht kompiliert werden, soweit ich weiß, dass Funktionen nicht verschachtelt werden können. – perencia

+0

* "Dies ist, was ich bisher habe, aber ich bin mir nicht ganz sicher, ob es korrekt ist." * - Ich bin mir nicht sicher, ob dein Problem/deine Frage hier klar genug ist. Ihr Code scheint zu laufen und keine größeren Kompilierungsfehler (mit Ausnahme einer fehlenden Klammer auf getPrice möglicherweise Copy Paste-Fehler?). Etwas zu beachten, die Methode 'Arrays.sort (Produkte);' wird Ihre Produkttitel neu ordnen, aber nicht die 'Preise' neu ordnen, sobald Sie es einmal sortiert haben, irgendwie geschraubt. Consender macht eine 'Product' Klasse, die einen' Preis' und 'Titel' hat, damit die 2 in Verbindung bleiben. –

Antwort

1

Nein, es ist im Allgemeinen nicht korrekt. Der Grund dafür ist, dass Sie das Array articles sortieren, aber Sie behalten das Array arrivals unverändert, damit die Produkte nicht ihren Preisen im Allgemeinen entsprechen, d. H. Die Indexpositionen stimmen nicht überein.

private void getPrice(String s) { 
    Arrays.sort(products); <--- sort products, but prices' indices remain unchanged 
    int searchedProductIndex = Arrays.binarySearch(products, s); 
    if (searchedProductIndex >= 0) { 
     this.price = prices[searchedProductIndex]; 
     this.isValidOrder = true; 
    } else { 
     price = 0.0; 
     isValidOrder = false; 
     message = "**ERROR**: Invalid product name"; 
    } 
    } <--- closing curly bracket 

Beachten Sie Folgendes.

  • Binary Suche können nur in sortierten Sammlung verwendet werden
  • Wenn Sie Produkte Array sortieren, dann müssen Sie die Preise Array entsprechend, so dass die Indexpositionen Spiel ändern. Sie tun das nicht in Ihrer App.
  • Auch, als eine Randnotiz, überprüfen Sie Ihre Syntax. Ihr kopierter Code wird nicht kompiliert. Z.B. Sie haben eine schließende Klammer für die getPrice-Funktion verpasst.
+0

Was wäre, wenn es bei der Deklaration des Arrays bereits an den richtigen Indexpositionen wäre? –