在Java中,根据字符串列表对整数列表进行排序

在Java中,根据字符串列表对整数列表进行排序,java,list,sorting,Java,List,Sorting,我有一个类似这样的数据集: 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] ... 95 [Antarctica] 95 [Italy] 95 [Tibet, Nepal] 91

我有一个类似这样的数据集:

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]
...
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]
...
我使用下面的代码(定义类模型)根据整数对其进行排序:

排序后,数据集(基于整数排序)如下所示:

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]
...
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]
...
现在,需要按照国家(字符串)列表的字母顺序对新生成的数据集进行排序。例如,在新的数据集中,有两个记录具有相同的整数84(第一个整数表示国家蒙古,第二个整数表示国家非洲联盟),因此第二个记录应排在第一位,因为非洲联盟按字母顺序排在蒙古之前

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

问题:如何根据字符串列表对整数列表进行排序?

您可以进一步专门化compareTo函数以进行二次比较。我假设每个列表至少包含一个国家;如果不是这样,则必须处理空列表。修改后的比较器如下所示:

@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));
    }
}
根据@Andrew的风格


我不太清楚你的问题是什么。下面的伪代码是否解决了您的问题

@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;
    }
}
@覆盖
公共int比较(其他){
如果(敌意==其他敌意){
//让我们比较整数等于(84,84)时的字符串列表
String firstOtherCountry=other.countries.SortAlphabetically().get(0);
//我们为当前行和其他行对国家列表进行排序
//按字母顺序比较每个列表的第一个元素:
//在此处返回1、0或-1。
}else if(敌意<其他敌意){
返回-1;
}else if(敌意>其他.敌意){
返回1;
}否则{
返回0;
}
}

如果您这样做,接受的答案建议:

wonders.sort(Comparator.comparingInt(Wonder::getHostility).reversed()
    .thenComparing(wonder -> wonder.getCountries().get(0)));
在您提供的文本文件上,您将获得下一个结果:

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]
但是,如果您先对
国家进行排序,然后再进行接受回答:

wonders.forEach(wonder -> Collections.sort(wonder.getCountries()));
wonders.sort(Comparator.comparingInt(Wonder::getHostility).reversed().
    thenComparing(wonder -> wonder.getCountries().get(0))); 
然后你会得到:

95 [Antarctica]
95 [Italy]
95 [Nepal, Tibet]
91 [Israel, Jordan]
85 [France, Italy] 
85 [France, Italy, Switzerland]
84 [African Union]
84 [China, Mongolia]
82 [Argentina]
80 [USA]
70 [Australia]
69 [Canada, USA]
69 [Japan]
65 [The Hawaiian Islands]
65 [USA]
55 [Russia]
50 [Argentina, Brazil]
19 [Tanzania]
17 [Northern Ireland]
16 [China]
12 [African Union]
10 [Australia]
10 [Brazil]
2 [USA]
注意这两个列表中值为
85
69
advisive
。顺序不一样。不知道这是否与你有关

注意:如果您实现了
Comparable#compareTo()
,您还应该实现
equals()
,因为它们之间存在契约:

(x.compareTo(y) == 0) == (x.equals(y))
如果不是这样,您应该注意:
这个类的自然顺序与equals不一致。

最后一件事:


compareTo()
必须抛出
NullPointerException
,如果将当前对象与
null
对象进行比较,而不是在这种情况下返回
false
equals()
对象。

可能重复的FYI:,您的
compareTo
方法可以缩短为
返回整数。compare(this.adivity,other.adivity)
--按降序排列的
可比较的
对象列表可以写成
wonders.sort(Comparator.reverseOrder())
,所以不需要排序()
+
reverse()
。您不应该先对
国家进行排序,然后按
敌意进行排序,最后按国家名称进行排序吗。我查看了您的文本文件,其中有
69[日本]
69[美国、加拿大]
。例如,如果您有
69[加拿大,美国]
,则顺序将不同。@Freeman但列表使用下面的答案正确排序。如果你有答案,请把它贴出来。谢谢是否检查了没有列表为空?list=getAllData(filePath);System.out.println(wonders.stream().anyMatch(w->w.countries.size()=0));这将告诉您是否有任何空的国家/地区列表!我忘了你在倒车。然后,只需将最后一行更改为返回负的countries.get(0).compareTo(other.countries.get(0))@AndrewTobilko当您反转时,您反转了整个比较器(在比较()之后反转()。我只反转了整数(基于敌意的)比较器(在比较()之前反转())。
if
的第一个条件检查不应该出现
敌意
要么更大,要么更低,如果它相等,你比较国家(可能更大,更低或相等)…不明白这一点。
。SortAlphabetically()
?你问题的关键是你想按敌意排序,然后按国家的字母顺序排序。我的例子中看到,首先对国家进行分类并不是一个解决办法。顺便说一句,谢谢你的回答。赞成票
(x.compareTo(y) == 0) == (x.equals(y))