[英]Sorting an array using Comparator
I have the following code. 我有以下代码。 When I try to compile it, it gives me the following error: 当我尝试编译它时,它给我以下错误:
The method sort(List<T>, Comparator<? super T>) in the type Collections is not
applicable for the arguments (Software[], new Comparator(){})
The type new Comparator(){} must implement the inherited abstract method
Comparator.compare(Object, Object)
import java.text.DecimalFormat; // For proper currency
import java.util.Comparator;
import java.util.Collections;
public class Software
{
// Declare variables
String SoftwareTitle; // SoftwareTitle
int SoftwareStock; // Software totals
double SoftwarePrice; // Software Price
int SoftwareNum; // Software Product ID
double CalculateInventory; // To add inventory
double SoftwareValue; // Software Total value
double value; // Complete inventory total
Software( String softtitle, int softstock, double softprice, int softitemnum )
{
// Create object constructor
SoftwareTitle = softtitle;
SoftwareStock = softstock;
SoftwarePrice = softprice;
SoftwareNum = softitemnum;
}
// Set Software Title
public void setSoftwareTitle( String softtitle )
{
SoftwareTitle = softtitle;
}
// Return Software Title
public String getSoftwareTitle()
{
return SoftwareTitle;
}
// Set software inventory
public void setSoftwareStock( int softstock)
{
SoftwareStock = softstock;
}
// Return software inventory
public int getSoftwareStock()
{
return SoftwareStock;
}
// Set software price
public void setSoftwarePrice( double softprice )
{
SoftwarePrice = softprice;
}
// Return software price
public double getSoftwarePrice()
{
return SoftwarePrice;
}
// Set item number
public void setSoftwareNum( int softitemnum )
{
SoftwareNum = softitemnum;
} //
//return software item number
public int getSoftwareNum()
{
return SoftwareNum;
} //
// calculate inventory value
public double Softwarevalue()
{
return SoftwarePrice * SoftwareStock;
}
public void setCalculateInventory (double value){
this.CalculateInventory = value;
}
public double getCalculateInventory(){
double value = 0;
for(int i = 0; i < 3; i++){
value = Softwarevalue();
}
return value;
}
}//end method value
//
import java.text.DecimalFormat; // For proper currency
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
public class Inventory {
public static void main( String args[] )
{
// Start array of software titles
Software[] aSoftware = new Software[4];
aSoftware[0]= new Software("Command and Conquer ", 6, 29.99, 10122);
aSoftware[1]= new Software("Alice in Wonderland", 1, 10.99,10233);
aSoftware[2]= new Software("Doom", 1, 10.99, 10344);
aSoftware[3]= new Software("Walking Dead", 6, 9.99, 10455);
//Set currency format
DecimalFormat money = new DecimalFormat("$0.00");
// Sort in order of Software Name
Collections.sort(aSoftware, new Comparator() {
public int compare(Software s1, Software s2) {
return s1.getSoftwareTitle().compareTo(s2.getSoftwareTitle());
}
});
// Display software title, number of units, cost, item number and total inventory
for (int i = 0; i < aSoftware.length; i++){
System.out.println("Software Title is "+ aSoftware[i].getSoftwareTitle() );
System.out.println("The number of units in stock is "+ aSoftware[i].getSoftwareStock() );
System.out.println("The price of the Software Title is "+ (money.format(aSoftware[i].getSoftwarePrice() )));
System.out.println( "The item number is "+ aSoftware[i].getSoftwareNum());
System.out.println( "The value of the Software Inventory is "+ (money.format(aSoftware[i].Softwarevalue() )));
System.out.println();
}
//output total inventory value
double total = 0.0;
for (int i = 0; i < 3; i++){
total += aSoftware[i].getCalculateInventory();
}
System.out.printf("Total Value of Software Inventory is: \t$%.2f\n", total);
//end output total inventory value
}
}
//
//end
How do I get the software titles (an array) to display in alphabetical order using the Comparator? 如何使用比较器按字母顺序显示软件标题(数组)?
You've got two problems: 你有两个问题:
1) You're using Collections.sort
(which takes a List<E>
), but trying to sort an array. 1)您正在使用Collections.sort
(它接受List<E>
),但尝试对数组进行排序。 Use Arrays.sort
instead. 请改用Arrays.sort
。
2) You need to specify that you're implementing Comparator<Software>
, not just the raw Comparator
type. 2)您需要指定您正在实现Comparator<Software>
,而不仅仅是原始Comparator
类型。
So basically, this works: 基本上,这是有效的:
Arrays.sort(aSoftware, new Comparator<Software>() {
public int compare(Software s1, Software s2) {
return s1.getSoftwareTitle().compareTo(s2.getSoftwareTitle());
}
});
Firstly: to sort an array, such as Software[]
, you need to use java.util.Arrays.sort
rather than java.util.Collections.sort
. 首先:要对数组进行排序,例如Software[]
,您需要使用java.util.Arrays.sort
而不是java.util.Collections.sort
。
Secondly: since your Comparator
is specifically for Software
instances, you should write new Comparator<Software>()
rather than merely new Comparator()
. 其次:由于您的Comparator
专门用于Software
实例,因此您应该编写new Comparator<Software>()
而不仅仅是new Comparator()
。 (The latter is actually bad code even when it does work.) (即使它确实有效,后者实际上也是错误的代码。)
You can't sort on array when using Collections.sort
. 使用Collections.sort
时,无法对数组进行排序。 Collections.sort
accepts only List. Collections.sort
仅接受List。 user Arrays.sort
rather than Collection.sort
. 用户Arrays.sort
而不是Collection.sort
。
Because you are trying to use array of object use below: 因为您正在尝试使用下面的对象数组:
Arrays.sort(aSoftware);
and your software class should implements implements Comparable and override its compareTo method: 并且您的软件类应该实现实现Comparable并覆盖其compareTo方法:
@Override
public int compareTo(Software o) {
return this.getSoftwareTitle().compareTo(o.getSoftwareTitle());
}
I have made correction to your class as below: 我已经对你的班级进行了修改,如下所示:
public class Software implements Comparable<Software>{
// Declare variables
String SoftwareTitle; // SoftwareTitle
int SoftwareStock; // Software totals
double SoftwarePrice; // Software Price
int SoftwareNum; // Software Product ID
double CalculateInventory; // To add inventory
double SoftwareValue; // Software Total value
double value; // Complete inventory total
Software(){
}
Software(String softtitle, int softstock, double softprice, int softitemnum)
{
// Create object constructor
SoftwareTitle = softtitle;
SoftwareStock = softstock;
SoftwarePrice = softprice;
SoftwareNum = softitemnum;
}
// Set Software Title
public void setSoftwareTitle(String softtitle) {
SoftwareTitle = softtitle;
}
// Return Software Title
public String getSoftwareTitle() {
return SoftwareTitle;
}
// Set software inventory
public void setSoftwareStock(int softstock) {
SoftwareStock = softstock;
}
// Return software inventory
public int getSoftwareStock() {
return SoftwareStock;
}
// Set software price
public void setSoftwarePrice(double softprice) {
SoftwarePrice = softprice;
}
// Return software price
public double getSoftwarePrice() {
return SoftwarePrice;
}
// Set item number
public void setSoftwareNum(int softitemnum) {
SoftwareNum = softitemnum;
} //
// return software item number
public int getSoftwareNum() {
return SoftwareNum;
} //
// calculate inventory value
public double Softwarevalue() {
return SoftwarePrice * SoftwareStock;
}
public void setCalculateInventory(double value) {
this.CalculateInventory = value;
}
public double getCalculateInventory() {
double value = 0;
for (int i = 0; i < 3; i++) {
value = Softwarevalue();
}
return value;
}
@Override
public int compareTo(Software o) {
return this.getSoftwareTitle().compareTo(o.getSoftwareTitle());
}
}// end method value
Your Inventory class: 您的库存类:
public class Inventory {
public static void main(String args[])
{
// Start array of software titles
Software[] aSoftware = new Software[4];
aSoftware[0] = new Software("Command and Conquer ", 6, 29.99, 10122);
aSoftware[1] = new Software("Alice in Wonderland", 1, 10.99, 10233);
aSoftware[2] = new Software("Doom", 1, 10.99, 10344);
aSoftware[3] = new Software("Walking Dead", 6, 9.99, 10455);
// Set currency format
DecimalFormat money = new DecimalFormat("$0.00");
Arrays.sort(aSoftware);
// Display software title, number of units, cost, item number and total
// inventory
for (int i = 0; i < aSoftware.length; i++) {
System.out.println("Software Title is "
+ aSoftware[i].getSoftwareTitle());
System.out.println("The number of units in stock is "
+ aSoftware[i].getSoftwareStock());
System.out.println("The price of the Software Title is "
+ (money.format(aSoftware[i].getSoftwarePrice())));
System.out.println("The item number is "
+ aSoftware[i].getSoftwareNum());
System.out.println("The value of the Software Inventory is "
+ (money.format(aSoftware[i].Softwarevalue())));
System.out.println();
}
// output total inventory value
double total = 0.0;
for (int i = 0; i < 3; i++) {
total += aSoftware[i].getCalculateInventory();
}
System.out.printf("Total Value of Software Inventory is: \t$%.2f\n",
total);
// end output total inventory value
}
}
Below is final output in sorted order: 以下是按排序顺序的最终输出:
Software Title is Alice in Wonderland
The number of units in stock is 1
The price of the Software Title is $10.99
The item number is 10233
The value of the Software Inventory is $10.99
Software Title is Command and Conquer
The number of units in stock is 6
The price of the Software Title is $29.99
The item number is 10122
The value of the Software Inventory is $179.94
Software Title is Doom
The number of units in stock is 1
The price of the Software Title is $10.99
The item number is 10344
The value of the Software Inventory is $10.99
Software Title is Walking Dead
The number of units in stock is 6
The price of the Software Title is $9.99
The item number is 10455
The value of the Software Inventory is $59.94
Total Value of Software Inventory is: $201.92
You should make your "Software" class implement comparable and then overwrite the compare method to return a compare on the titles like you did outside your code. 您应该使您的“软件”类工具具有可比性,然后覆盖比较方法,以便像在代码之外那样返回标题上的比较。 This will be a replacement for the comparator. 这将取代比较器。 Then all you need to to is call Arrays.sort. 然后你需要的就是调用Arrays.sort。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.