按自然顺序排序数组

时间:2011-01-09 21:09:43

标签: java arrays sorting

好的,使用你的工具Comparator。它返回错误,抱怨字符串值与return 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 个答案:

答案 0 :(得分:5)

这是因为您尝试对cdinventoryItem个对象进行排序,但cdinventoryItem未实现Comparable。因此,Arrays.sort没有关于如何对数组进行排序的线索。您需要实施Comparable才能确定对象的natural order

例如,如果您想按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's naming conventions。例如,Java类名称​​应该是名词,大小写混合,每个内部单词大写的第一个字母。因此,您应该cdInventoryItem而不是CdInventoryItem

答案 1 :(得分:4)

您需要让cdinventoryItem类实现Comparable接口,或编写Comparator的实现。在任何一种情况下,您都可以实现逻辑来决定哪个元素首先出现并返回-1,1或0来表示之前,之后或相同。

e.g。

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

由于String实现了Comparable,您可以委托给它。

答案 2 :(得分:0)

我认为问题在于您尝试比较的对象没有在其上定义的排序,因为它们没有实现Comparable接口。因此,当提供的排序例程试图找出元素应该进入的顺序时,它会发现它无法这样做并放弃。

要解决此问题,请尝试使用compareTo实现Comparable接口。或者,定义一个自定义Comparator类并将其作为参数传递给Arrays.sort。

答案 3 :(得分:0)

这正是它所说的内容:它无法对cdinventoryItem列表进行排序,因为它们不是Comparable:即它不知道如何比较它们。如果你不能看到其中的两个并且说哪个应该放在另一个面前,你怎么期望把事情整理好呢?

您希望如何对它们进行排序,为什么? (毕竟,如果您重新订购库存,库存价值不会改变......)

答案 4 :(得分:0)

您必须告诉sort如何比较基本类型或字符串以外的对象(以及实现Comparable接口的其他对象)。 Java不知道如何对cdinventoryItem进行排序。

你可以: 1)使cdinventoryItem实现Comparable接口并实现方法:

public int compareTo(Object o) 如果项目分别小于,等于或大于o,则返回-1,0,1。 (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Comparable.html)

2)将Comparator对象传递给带有两个对象的sort方法,如果第一个对象分别比第二个对象小于,等于或大于第二个对象,则返回-1,0,1。

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

答案 5 :(得分:-1)

您可以尝试Bean Comparator