Сортировка массива в естественном порядке - PullRequest
1 голос
/ 10 января 2011

ОК, используя ваш компаратор навесного оборудования. Он возвращает ошибки, сообщающие о несовместимости строкового значения с возвращаемым значением int.

class cdinventoryItem implements Comparable<cdinventoryItem> {

        private String Ptitle;
        private int PitemNumber;
        private int PnumberofUnits;
        private double PunitPrice;
        private double Evalue;


        public cdinventoryItem(String title, int itemNumber, int numberofUnits, double unitPrice ){

                Ptitle = title;
                PitemNumber = itemNumber;
                PnumberofUnits = numberofUnits;
                PunitPrice = unitPrice;

        }
 public int compareTo(cdinventoryItem otherItem) {
    return this.Ptitle.compareTo(otherItem.getTitle());
  }

  public int getTitle() {
    return Ptitle;
  }



        public double stockValue () {
            return PnumberofUnits * PunitPrice;
        }


        public double getEntireStockValue () {
            Evalue = Evalue + this.stockValue();
            return Evalue;
        }


        @Override public String toString(){


            NumberFormat dformat = new DecimalFormat("#0.00");


            StringBuilder ouput  = new StringBuilder();
            String New_Line = System.getProperty("line.separator");

                ouput.append ("The product number of my CD is: " + PitemNumber + New_Line);
                ouput.append ("The title of the CD is: " + Ptitle + New_Line);
                ouput.append ("I have " + PnumberofUnits + " units in stock." + New_Line);
                ouput.append ("The total value of my inventory on this product is: " + dformat.format (stockValue()) + New_Line);
                return ouput.toString();
            }

}



public class cdinventoryprogram {

    public static void main(String[] args) {

    NumberFormat dformat = new DecimalFormat("#0.00");
    double Tvalue= 0.0;

    int DEFAULT_LENGTH = 3;

        System.out.println ("Welcome to my CD inventory program!!");
        System.out.println ("");


            cdinventoryItem  initem[] = new cdinventoryItem [DEFAULT_LENGTH];

            initem [0] = new cdinventoryItem ("The Illusionist", 1, 5, 15.99);
            initem [1] = new cdinventoryItem ("Matrix", 2, 3, 14.99);
            initem [2] = new cdinventoryItem ("Old School", 3, 6, 12.99);


            Arrays.sort(initem,
            new Comparator<cdinventoryItem>() {
            public int compare(cdinventoryItem item1, cdinventoryItem item2) {
            return item1.getTitle().compareTo(item2.getTitle());
    }});

                for ( cdinventoryItem currentcdinventoryItem : initem ){
                System.out.println( currentcdinventoryItem );
                Tvalue = Tvalue + currentcdinventoryItem.getEntireStockValue();
                }

                System.out.println ("The total value of my entire inventory is:");
                System.out.println ( "$" + dformat.format (Tvalue));
                System.out.println();
    }}

Ответы [ 6 ]

5 голосов
/ 10 января 2011

Это происходит потому, что вы пытаетесь отсортировать массив cdinventoryItem объектов, но cdinventoryItem не реализует Comparable. Таким образом, Arrays.sort не имеет понятия о том, как отсортировать ваш массив. Вам нужно реализовать Comparable, чтобы определить естественный порядок ваших объектов.

Например, если вы хотите заказать его по title:

public class cdinventoryItem implements Comparable<cdinventoryItem> {
  // your code

  public int compareTo(cdinventoryItem otherItem) {
    return this.Ptitle.compareTo(otherItem.getTitle());
  }

  public String getTitle() {
    return Ptitle;
  }
}

В качестве альтернативы вы можете использовать Arrays.sort(T[], java.util.Comparator) и определить используемый метод сортировки:

cdinventoryItem initem[] = new cdinventoryItem[DEFAULT_LENGTH];
// fill array
Arrays.sort(initem, 
  new Comparator<cdInventoryItem>() {
    public int compare(cdInventoryItem item1, cdInventoryItem item2) {
        return item1.getTitle().compareTo(item2.getTitle());
    }
  }
);

PS : Пожалуйста, , попробуйте следовать Соглашениям Oracle об именах Например, имена классов Java должны быть существительными в смешанном регистре с первой буквой каждого внутреннего слова, заглавными . Таким образом, вместо cdInventoryItem вы должны иметь CdInventoryItem.

4 голосов
/ 10 января 2011

Вам нужно либо заставить класс cdinventoryItem реализовать интерфейс Comparable, либо написать реализацию Comparator. В любом случае вы реализуете логику для определения того, какой элемент стоит первым, и возвращаете -1, 1 или 0 для представления до, после или того же самого.

, например

class cdinventoryItem() implements Comparable<cdinventoryItem> {
    ...
    public int compareTo(cdinventoryItem other) {
        return this.Ptitle.compareTo(other.Ptitle);
    }
}

Поскольку String реализует Comparable, вы можете просто делегировать это.

0 голосов
/ 10 января 2011

Вы должны указать sort, как сравнивать объекты, отличные от примитивных типов или строк (и некоторых других, которые реализуют интерфейс Comparable). Java не знает, как сортировать cdinventoryItem.

Вы можете либо: 1) Заставьте cdinventoryItem реализовать интерфейс Comparable и реализовать метод:

public int compareTo (Object o) Возвращает -1, 0, 1, если элемент меньше, равен или больше, соответственно, o. (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Comparable.html)

2) Передайте объект Comparator методу сортировки, который принимает два объекта и возвращает -1, 0, 1, если первый объект сравнивается меньше, равен или больше второго объекта соответственно.

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html

0 голосов
/ 10 января 2011

Это означает именно то, что написано: он не может отсортировать список cdinventoryItem, потому что они не Comparable: то есть он не знает, как их сравнивать. Как вы ожидаете навести порядок, если не можете взглянуть на два из них и сказать, что должно идти впереди другого?

Как вы хотите, чтобы они были отсортированы, и почему ? (В конце концов, стоимость акций не изменится, если вы повторно закажете акции ...)

0 голосов
/ 10 января 2011

Я думаю, что проблема в том, что объекты, которые вы пытаетесь сравнить, не имеют определенного порядка, потому что они не реализуют интерфейс Comparable. Следовательно, когда предоставляемые процедуры сортировки пытаются выяснить, в каком порядке должны располагаться элементы, он обнаруживает, что не может это сделать, и сдается.

Чтобы исправить это, попробуйте реализовать Comparable интерфейс с CompareTo. Также можно определить собственный класс Comparator и передать его в качестве параметра в Arrays.sort.

0 голосов
/ 10 января 2011

Вы можете попробовать Bean Comparator .

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