我必须按照降序获得的金牌数量对国家进行排序。如果几个国家被捆绑在一起,我需要按照银牌的数量对并列国家进行排序,然后是青铜金属,那么如果还有平局,我需要按字母顺序升序对它们进行排序。我已经编写了一个比它可能需要的程序复杂得多的程序,但它仍然返回无序的字符串列表。输入是按年份给出的,第一个国家是金牌得主,第二个是银牌,第三个是铜牌。 e.g:
public class MedalTable {
public static void main(String[] args){
String[] input = {"ITA JPN AUS", "KOR TPE UKR", "KOR KOR GBR", "KOR CHN TPE"};
generate(input);
}
public static void generate(String[] results) {
// you fill in this code
//"ITA JPN AUS", "KOR TPE UKR", "KOR KOR GBR", "KOR CHN TPE"
String[] countrystrings = setupstuff(results);
ArrayList<Integer> goldnums = new ArrayList<Integer>();
ArrayList<Integer> silvnums = new ArrayList<Integer>();
ArrayList<Integer> broznums = new ArrayList<Integer>();
for(int o = 0; o < countrystrings.length; o++){
goldnums.add(Integer.parseInt(Character.toString(countrystrings[o].charAt(4))));
silvnums.add(Integer.parseInt(Character.toString(countrystrings[o].charAt(6))));
broznums.add(Integer.parseInt(Character.toString(countrystrings[o].charAt(8))));
}
}
public static String[] setupstuff(String[] data){
Map<String, Integer> goldmap = new TreeMap<String, Integer>();
Map<String, Integer> silvermap = new TreeMap<String, Integer>();
Map<String, Integer> bronzemap = new TreeMap<String, Integer>();
ArrayList<String> goldlist = new ArrayList<String>();
ArrayList<String> silverlist = new ArrayList<String>();
ArrayList<String> bronzelist = new ArrayList<String>();
ArrayList<String> countries = new ArrayList<String>();
for (String i : data){
goldlist.add(i.substring(0, 3));
silverlist.add(i.substring(4, 7));
bronzelist.add(i.substring(8, 11));
}
populatemap(goldmap, goldlist);
populatemap(silvermap, silverlist);
populatemap(bronzemap, bronzelist);
countries = getuniquecountries(goldmap, silvermap, bronzemap);
String[] countrystrings = new String[countries.size()];
countrystrings = createmedalstring(countries, goldmap, silvermap, bronzemap);
Arrays.sort(countrystrings);
for(int v = 0; v < countrystrings.length; v++){
System.out.println(countrystrings[v]);
}
return countrystrings;
}
public static String[] createmedalstring(ArrayList<String> array, Map<String, Integer> gldmap,
Map<String, Integer> slvmap, Map<String, Integer> brzmap){
String[] thiscountry = new String[array.size()];
ArrayList<String> tempstring = new ArrayList<String>();
for (int j = 0; j < array.size(); j++){
thiscountry[j] = array.get(j);
}
String[] concatstuff = new String[thiscountry.length];
for (int k = 0; k < thiscountry.length; k++){
concatstuff[k] = thiscountry[k];
}
for (int i = 0; i < thiscountry.length; i++){
tempstring.add(thiscountry[i]);
if(gldmap.containsKey(thiscountry[i])){
tempstring.add(" " + gldmap.get(array.get(i).toString()));
}
else{
tempstring.add(" 0");
}
if(slvmap.containsKey(thiscountry[i])){
tempstring.add(" " + slvmap.get(array.get(i).toString()));
}
else{
tempstring.add(" 0");
}
if(brzmap.containsKey(thiscountry[i])){
tempstring.add(" " + brzmap.get(array.get(i).toString()));
}
else{
tempstring.add(" 0");
}
concatstuff[i] = tempstring.get(0) + tempstring.get(1) + tempstring.get(2) + tempstring.get(3);
tempstring.clear();
}
return concatstuff;
}
public static ArrayList<String> getuniquecountries(Map<String, Integer> gldmap,
Map<String, Integer> slvmap, Map<String, Integer> brzmap){
ArrayList<String> countries = new ArrayList<String>();
for(Entry<String, Integer> i : gldmap.entrySet()){
if(!countries.contains(i.getKey()))
countries.add(i.getKey());
}
for(Entry<String, Integer> j : slvmap.entrySet()){
if(!countries.contains(j.getKey()))
countries.add(j.getKey());
}
for(Entry<String, Integer> k : brzmap.entrySet()){
if(!countries.contains(k.getKey()))
countries.add(k.getKey());
}
return countries;
}
public static void populatemap(Map<String, Integer> map, ArrayList<String> array){
for (String i : array){
if(map.containsKey(i)){
map.put(i, map.get(i) + 1);
}
else{
map.put(i, 1);
}
}
//System.out.println(map);
}
}
返回:
AUS 0 0 1 CHN 0 1 0 GBR 0 0 1 ITA 1 0 0 JPN 0 1 0 KOR 3 1 0 TPE 0 1 1 UKR 0 0 1
但是,我在尝试订购上述输出时遇到了一些严重问题。我如何通过奖牌的价值而不是按字母顺序排序,就像他们现在一样?
答案 0 :(得分:4)
我认为解决问题的更好方法是创建一个这样的类:
class OlympicCountry implements Comparable<OlympicCountry> {
private int goldCount;
private int silverCount;
private int bronzeCount;
private String name;
// . . .
public String toString() {
return String.format("%s %d %d %d", name, goldCount, silverCount, bronzeCount);
}
public int compareTo(OlympicCountry other) {
if (this.goldCount != other.goldCount)
return this.goldCount > other.goldCount ? 1 : -1;
if (this.silverCount != other.silverCount)
return this.silverCount > other.silverCount ? 1 : -1;
// . . .
return this.name.compareTo(other.name);
}
}
正确定义compareTo
(这是[{3}})方法的一部分后,您应该能够使用Comparable<T>
interface对您的列表进行排序,或者如果您坚持使用Collections.sort
使用数组而不是列表。
OlympicCountry
类的toString
方法负责正确格式化数据以进行显示(或者您计划使用它进行的任何操作)。
实现像这样的对象来存储和操作原始数据,而不是将它们全部放在String或整数或其他内容中,然后尝试操作它,这通常是一个更好的设计。这就是我们毕竟可以声明自己的类的原因。
答案 1 :(得分:2)
这是使用可比较的treeSet添加到OlympicCountry的答案
public class OlympicCountry implements Comparable<OlympicCountry> {
public static void main(String args[]){
Set<OlympicCountry> set = new TreeSet<OlympicCountry>(new Comparator<OlympicCountry>() {
@Override
public int compare(OlympicCountry o1, OlympicCountry o2) {
return -o1.compareTo(o2);
}
});
OlympicCountry c1 = new OlympicCountry();
// set values to c1
set.add(c1);
OlympicCountry c2 = new OlympicCountry();
// set values to c2
set.add(c2);
}
}
答案 2 :(得分:1)
Java是面向对象的语言,使用一些对象来执行此操作。 创建某种类来表示具有变量的国家,以存储金牌,银牌和铜牌以及国家名称。
在该类中(称之为Country
)实现Comparable interface
,您可以在其中实现已定义的排序规则。
在正在运行的程序中,您可以使用Country
Collections.sort()
个对象列表并进行排序