Как сделать сортировку массива по Product [counter] .getProductTitle ()? - PullRequest
1 голос
/ 22 августа 2009

Вопрос: Откуда взято productArray в этих:

for ( Product product : productArray )

&

Arrays.sort( productArray, new ProductComparator() );

Вопрос: что я делаю не так? Как мне сделать этот сорт?

Похожие Сообщение от Вчера


                                 EDIT

::: EDIT ::: Хорошо, я взял ваш совет здесь о

Product productArray[] = new Product[ARRAY_LENGTH]

Теперь это сломано здесь

/tmp/jc_22339/InventoryPart2.java:99: cannot find symbol
symbol  : variable productArray
location: class InventoryPart2
    for ( Product product : productArray ) {
                            ^
/tmp/jc_22339/InventoryPart2.java:101: cannot find symbol
symbol  : variable productArray
location: class InventoryPart2
        inventoryValue += productArray.calcInventoryValue();
                          ^

И если я сделаю это как

for ( Product product : productArray[] ) {

Я получаю

/tmp/jc_23524/InventoryPart2.java:69: '.class' expected
    for ( Product product : productArray[] ) {
                                           ^

Так что я снова застрял.


Начать программу

::: Обновлен код :::

    /**
 This program stores a collection of a product and its variables in a java array
 It will sort and display the information with a total
 */

// Import statements go here
import java.util.Scanner;// Import and use scanner
import java.util.Arrays;


public class InventoryPart2 {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {// begin main

        // Define your array of product objects and index here
        final int ARRAY_LENGTH = 5;// declare constant 
        final int version = 2;// declare int version number   

        // Create instance of Scanner class
        Scanner input = new Scanner( System.in );// new Scanner for CL input
        // Set counter to loop x times to populate your array of product objects
        int counter = 0;

        // Initialize your product array with the number of objects to populate it with
        Product productArray[] = new Product[ARRAY_LENGTH];// create array Product of class Product 

        // Welcome message
        System.out.printf( "\n%s%d\n" , 
        "Welcome to the Productentory Program v.", version );

        // Construct default values for Product
        productArray[0] = new Product("EThe Invisible Man", 0, 8.50);
        productArray[1] = new Product("DThe Matrix", 1, 17.99);
        productArray[2] = new Product("CSe7en", 7, 12.99);
        productArray[3] = new Product("BOceans Eleven", 11, 9.99);
        productArray[4] = new Product("AHitch Hikers Guide to the Galaxy", 42, 18.69);

        /*// Loop as many times as your counter variable
        {

            // Instantiate a product object

            // Prompt for product name and call the set method on your product object

            // Prompt for item number and call the set method on your product object

            // Prompt for units in stock and call the set method on your product object

            // Prompt for unit price and call the set method on your product object

            // store product object in array element

            //Destroy product object reference
            product = null;

            // Flush the buffer
            input.nextLine();

        }*/

        // Sort product array by product name using Comparator implementation class
        sortProductArray();

        // Print sorted array
        for ( Product product : productArray[] ) {
        if ( counter == 0 )
            System.out.printf( "\n%s\n", "Sorted Inventory of DVD movies");
        System.out.printf( "\n\n%s%d\n%s%s\n%s%d\n%s%,.2f\n%s%,.2f\n",
        "Item Number:      ",counter,
        "DVD Title:        ",productArray[counter].getProductTitle(),
        "Copies in stock:  ",productArray[counter].getUnitsInStock(),
        "Price each disk:  $",productArray[counter].getUnitPrice(),
        "Value of disks:  $",productArray[counter].calcInventoryValue());//End print
        counter++;  
        if ( counter == productArray.length)// on last counter of loop print total
            System.out.printf( "\n%s%,.2f\n\n\n",
            "Collection Value: $",calcTotalInventoryValue());
        }

        // Calculate total Inventory value

    }


 // method to calculate the total Inventory value
 private static double calcTotalInventoryValue()
 {

    double inventoryValue = 0;

    // Iterate array of product objects and calculate total value of entire Inventory
    for ( Product product : productArray ) {
        // accumulate inventory value from each product object in array
        inventoryValue += productArray.calcInventoryValue();
    }

     return totalInventoryValue;

 } // end method calcInventoryValue


 // method to sort product array
 private static void sortProductArray()
 {

    Arrays.sort( productArray, new ProductComparator() );



 } // end method calcInventoryValue


}

Ответы [ 4 ]

3 голосов
/ 22 августа 2009

Это

Product Product[] = new Product[ARRAY_LENGTH];

должно быть так:

Product productArray[] = new Product[ARRAY_LENGTH];

- Правка

Вам также необходимо изменить соответствующие строки, ссылающиеся на эту «переменную».

Если я могу предложить, если вас это смущает, вы просите своего учителя / книгу освежить вашу память о «переменных».

И не волнуйтесь, если не получите: продолжайте спрашивать, пока не получите. Вы готовы, если вы достаточно заинтересованы, чтобы учиться. Так что будьте заинтересованы, задавайте вопросы, проводите собственные исследования, и жизнь станет хорошей.

1 голос
/ 22 августа 2009

У вас должен быть массив Product как члена класса InventoryPart2 ИЛИ переданный в метод sortProductArray. Вам придется изменить этот метод, чтобы он возвращал ссылку на отсортированный массив, если вы выберете последний.

Ваш массив Product находится в методе static main и не является частью объекта, поэтому возникла проблема. Я бы порекомендовал вам сделать что-то вроде этого:

public class Inventory
{
    private static final int DEFAULT_INVENTORY_SIZE = 5;
    private Product [] products;
    private int numProducts;

    public Inventory()
    {
       this(DEFAULT_INVENTORY_SIZE);
    }

    public Inventory(int size)
    {
       products = new Product[size];
       numProducts = 0;
    }

    public void addProduct(Product p)
    {
       products[numProducts++] = p;

    }

    public void sort()
    {
        // sort the array here
    }

    public String toString()
    {
        StringBuilder builder = new StringBuilder(1024);

        // Create a string representation of you inventory here

        return builder.toString();
    } 
}

Объектно-ориентированное программирование - это инкапсуляция и сокрытие информации. Напишите класс таким образом, чтобы клиенты не знали и не заботились о том, используете ли вы массив или что-то еще для хранения продуктов. Вы абстрагируете идею инвентаризации здесь.

UPDATE:

Это ваш код, только лучше и работает:

import java.util.Scanner;
import java.util.Arrays;

public class InventoryPart2
{
   public static void main(String[] args)
   {
      final int ARRAY_LENGTH = 5;
      final int version = 2;

      int counter = 0;

      Product productArray[] = new Product[ARRAY_LENGTH];

      System.out.printf("\n%s%d\n",
      "Welcome to the Productentory Program v.", version);

      productArray[0] = new Product("EThe Invisible Man", 0, 8.50);
      productArray[1] = new Product("DThe Matrix", 1, 17.99);
      productArray[2] = new Product("CSe7en", 7, 12.99);
      productArray[3] = new Product("BOceans Eleven", 11, 9.99);
      productArray[4] = new Product("AHitch Hikers Guide to the Galaxy", 42, 18.69);

      productArray = sortProductArray(productArray);

      // Print sorted array
      for (Product product : productArray)
      {
         if (counter == 0)
         {
            System.out.printf("\n%s\n", "Sorted Inventory of DVD movies");
         }
         System.out.printf("\n\n%s%d\n%s%s\n%s%d\n%s%.2f\n%s%.2f\n",
         "Item Number:      ", counter,
         "DVD Title:        ", product.getProductTitle(),
         "Copies in stock:  ", product.getUnitsInStock(),
         "Price each disk:  $", product.getUnitPrice(),
         "Value of disks:  $", product.calcInventoryValue());
         counter++;
      }
      System.out.printf("\n%s%,.2f\n\n\n",
      "Collection Value: $", calcTotalInventoryValue(productArray));
   }

   private static double calcTotalInventoryValue(Product[] productArray)
   {
      double inventoryValue = 0;

      for (Product product : productArray)
      {
         inventoryValue += product.calcInventoryValue();
      }

      return inventoryValue;

   }

   private static Product[] sortProductArray(Product[] productArray)
   {
      Arrays.sort(productArray, new ProductComparator());

      return productArray;
   }
}

Я удалил те комментарии, которые вы добавляете везде. Они просто беспорядок; Я бы порекомендовал вам больше не делать этого. Лучше сделать ваш код более читабельным и самодокументируемым, используя лучшие имена переменных и методов.

Это все еще не тот способ, которым я бы порекомендовал вам написать, но это работает. Вы с большей вероятностью поймете, почему это работает, если я не буду слишком сильно его изменять.

ОБНОВЛЕНИЕ 2:

На случай, если вам интересно, вот как я мог бы написать это:

    import java.util.Scanner;
import java.util.Arrays;
import java.text.NumberFormat;

public class Inventory
{
   private static final int DEFAULT_LENGTH = 5;
   private static final int VERSION = 2;

   private Product[] products;
   private int numProducts;

   public static void main(String[] args)
   {
      Inventory inventory = new Inventory(5);

      inventory.addProduct(new Product("EThe Invisible Man", 0, 8.50));
      inventory.addProduct(new Product("DThe Matrix", 1, 17.99));
      inventory.addProduct(new Product("CSe7en", 7, 12.99));
      inventory.addProduct(new Product("BOceans Eleven", 11, 9.99));
      inventory.addProduct(new Product("AHitch Hikers Guide to the Galaxy", 42, 18.69));

      System.out.println(inventory);
      System.out.println("total value: " + NumberFormat.getCurrencyInstance().format(inventory.getTotalValue()));
   }

   public Inventory()
   {
      this(DEFAULT_LENGTH);
   }

   public Inventory(int size)
   {
      products = new Product[size];

      this.numProducts = 0;
   }

   public void addProduct(Product p)
   {
      products[numProducts++] = p;
   }

   public double getTotalValue()
   {
      double inventoryValue = 0.0;

      for (Product product : products)
      {
         inventoryValue += product.calcInventoryValue();
      }

      return inventoryValue;
   }

   public String toString()
   {
      StringBuilder builder = new StringBuilder(1024);
      String newline = System.getProperty("line.separator");

      if (products.length > 0)
      {
         Arrays.sort(products, new ProductComparator());
         for (Product product : products)
         {
            builder.append(product).append(newline);
         }
      }

      return builder.toString();
   }
}
1 голос
/ 22 августа 2009

Я думаю, что "productArray" должен ссылаться на массив продуктов, которые вы создали. Итак на линии:

Product Product[] = new Product[ARRAY_LENGTH];// create array Product of class Product 

Измените это тоже:

Product[] productArray = new Product[ARRAY_LENGTH];
0 голосов
/ 22 августа 2009

Не думайте про себя, что все здесь начали обнаруживать синтаксические ошибки в считанные секунды. Мы не были рождены таким образом, мы просто знаем, что искать, потому что мы совершили ту же самую ошибку сотни раз .

Так что, если вы убеждены, что хотите быть программистом, даже когда вы в своем уме, из-за таких вещей вы исключены. Посвящение и страсть гораздо важнее природных талантов.

Держи голову выше. Мы будем здесь в следующий раз, когда вы застрянете. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...