Sorting an array using a comparator

I have the following code. When I try to compile it, it causes 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) 

Code

 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 to get program names (array) to display in alphabetical order using a comparator?

+4
source share
5 answers

You have two problems:

1) You are using Collections.sort (which takes List<E> ), but trying to sort the array. Use Arrays.sort .

2) You need to indicate that you are implementing Comparator<Software> , and not just the type of raw Comparator .

So basically this works:

 Arrays.sort(aSoftware, new Comparator<Software>() { public int compare(Software s1, Software s2) { return s1.getSoftwareTitle().compareTo(s2.getSoftwareTitle()); } }); 
+6
source

First: to sort an array, such as Software[] , you need to use java.util.Arrays.sort , not java.util.Collections.sort .

Secondly: since your Comparator is specifically for instances of Software , you should write new Comparator<Software>() , not just new Comparator() . (The latter is really bad code, even if it works.)

+2
source

You cannot sort by array when using Collections.sort . Collections.sort only accepts a list. Arrays.sort user, not Collection.sort .

0
source

Since you are trying to use an array using objects below:

 Arrays.sort(aSoftware); 

and your software class should implement tools. Compare and override the compareTo method:

 @Override public int compareTo(Software o) { return this.getSoftwareTitle().compareTo(o.getSoftwareTitle()); } 

I made a fix for your class as shown 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 the 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 
0
source

You must make your Software class class comparable, and then rewrite the comparison method to return the comparison for titles such as outside of your code. This will be a replacement for the comparator. Then all you need to do is call Arrays.sort.

-1
source

Source: https://habr.com/ru/post/1443727/


All Articles