Sorting a List of integers based on a List of strings in Java

I have a Data Set something like this:

85 [Italy, France]    
95 [Italy]
91 [Israel, Jordan]
85 [France, Italy, Switzerland]
80 [USA]
84 [Mongolia, China]
95 [Antarctica]
84 [African Union]
82 [Argentina]
95 [Tibet, Nepal]
...

Which I have sorted based on based on the integers using below code (defining the class model):

public class Wonder implements Comparable<Wonder> {
    int hostility;
    List<String> countries;
    //some other data members

    //constructor
    //getters

    @Override
    public int compareTo(Wonder other) {
        if(hostility == other.hostility) {
            return 0;
        } else if(hostility < other.hostility) {
            return -1;
        } else if(hostility > other.hostility) {
            return 1;
        } else {
            return 0;
        }
    }
}

Sorting Code (PS: getAllData method will return a list of wonders, loading from Text file):

List<Wonder> wonders = getAllData(filePath);
wonders.sort((c1,c2)->c1.compareTo(c2));
Collections.reverse(wonders); // ordering highest to lowest 

After sorting the Data Set (sorted based on integers) looks something like this:

95 [Antarctica]
95 [Italy]
95 [Tibet, Nepal]
91 [Israel, Jordan]
85 [France, Italy, Switzerland]
85 [Italy, France]
84 [Mongolia, China]
84 [African Union]
82 [Argentina]
80 [USA]
...

Now, there is need to sort newly generated Data Set to alphabetically which are the List of countries (strings). For example, in new Data Set there’re two records with the same integer 84 (1st integer has country Mongolia and 2nd integer has country African Union), so the second record should come first as African Union is alphabetically before the Mongolia.

...
84 [African Union]
84 [Mongolia, China]
...

Question: How to sort a List of integers based on a List of strings?

3
Leave a Reply

avatar
3 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
Jason Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Jason
Guest

You can further specialize the compareTo function to enact a secondary comparison. I’m assuming that every list contains at least one country; if such is not the case, you must handle empty lists. The altered compareTo is as so: @Override public int compareTo(Wonder other) { if(this == other) { return 0; } else if(hostility < other.hostility) { return -1; } else if(hostility > other.hostility) { return 1; } else { return -countries.get(0).compareTo(other.countries.get(0)); } } Alternatively you may be looking for this: wonders.sort(Comparator.comparingInt(Wonder::getHostility).reversed() .thenComparing(wonder -> wonder.getCountries().get(0))); //don't reverse afterwards! according to @Andrew’s style A repl.it with the best of all answers

Jason
Guest

If you do, what accepted answer suggested: wonders.sort(Comparator.comparingInt(Wonder::getHostility).reversed() .thenComparing(wonder -> wonder.getCountries().get(0))); on text file, that you provided, you will get next result: 95 [Antarctica] 95 [Italy] 95 [Tibet, Nepal] 91 [Israel, Jordan] 85 [France, Italy, Switzerland] 85 [Italy, France] 84 [African Union] 84 [Mongolia, China] 82 [Argentina] 80 [USA] 70 [Australia] 69 [Japan] 69 [USA, Canada] 65 [The Hawaiian Islands] 65 [USA] 55 [Russia] 50 [Brazil, Argentina] 19 [Tanzania] 17 [Northern Ireland] 16 [China] 12 [African Union] 10 [Australia] 10 [Brazil] 2 [USA] But, if you first sort countries and then do accepted answer: wonders.forEach(wonder -> Collections.sort(wonder.getCountries())); wonders.sort(Comparator.comparingInt(Wonder::getHostility).reversed(). thenComparing(wonder ->… Read more »

Jason
Guest

Not sure I understood what is your issue. Does below pseudo code solve your problem ? @Override public int compareTo(Wonder other) { if(hostility == other.hostility) { // let's compare the strings list when hostility integer are equals (84, 84) String firstOtherCountry = other.countries.SortAlphabetically().get(0); // we sort the countries list for current line and other wonder // you compare alphabetically first element of each list : // return 1, 0 or -1 here. } else if(hostility < other.hostility) { return -1; } else if(hostility > other.hostility) { return 1; } else { return 0; } } How can I sort a… Read more »