【问题标题】:Android sort arrayAndroid 排序数组
【发布时间】:2011-09-07 16:09:56
【问题描述】:

我有一个由名称和分数组成的字符串数组。我想按分数对该数组进行排序。问题是,考虑到它是一个字符串数组,分数是导致 13,16,2,5,6 而不是 2,5,6,13,16 的字符串。我正在使用此代码:

int spaceIndex;
String[][] scoreboard;
String[] playername;
String[] score;
int sbsize;

array1.add("Thomas" + ":" + 5);
array1.add("Blueb" + ":" + 6);
array1.add("James" + ":" + 16);
array1.add("Hleb" + ":" + 13);
array1.add("Sabbat" + ":" + 2);
sbsize = array1.size();
scoreboard = new String[sbsize][2];
playername = new String[sbsize];
score = new String[sbsize];
pos2 = new int[sbsize];

for (int i=0; i<array1.size(); i++)
{
    spaceIndex =  array1.get(i).indexOf(':'); 
    scoreboard[i][0] = array1.get(i).substring(0, spaceIndex);
    scoreboard[i][1] = array1.get(i).substring(spaceIndex+1, array1.get(i).length());
}

Arrays.sort(scoreboard, new Comparator<String[]>() {
 @Override
 public int compare(String[] entry1, String[] entry2) {
    String time1 = entry1[1];
    String time2 = entry2[1];
    return time1.compareTo(time2);
    }
 });

解决办法是什么?

【问题讨论】:

标签: java arrays sorting


【解决方案1】:

将它们转换为 int。我记得,类似...

Arrays.sort(scoreboard, new Comparator<String[]>() {
     @Override
     public int compare(String[] entry1, String[] entry2) {
        Integer time1 = Integer.valueOf(entry1[1]);
        Integer time2 = Integer.valueOf(entry2[1]);
        return time1.compareTo(time2);
        }
     });

您还可以制作简单的值对象类以便于操作。喜欢...

class Player
{
  public String name;
  public int score;
}

然后你就可以制作了

 Player[] scoreboard = ...
 Arrays.sort(scoreboard, new Comparator<Player>() {
          @Override
          public int compare(Player player1, Player player2) {
              if(player1.score > player2.score) return 1;
              else if(player1.score < player2.score) return -1;
              else return 0;            
             }
 });

编辑: 我建议您了解基本的 OOP 原则,这将在开始时对您有很大帮助。

编辑 2:Java 8(带有功能接口和 lambda):

Arrays.sort(scoreboard, (player1, player2) -> {
  Integer time1 = Integer.valueOf(player1[1]);
  Integer time2 = Integer.valueOf(player2[1]);
  return time1.compareTo(time2);
});

【讨论】:

  • 谢谢,我正是想要这个!
【解决方案2】:
ArrayList<String> names= new ArrayList<String>();
    names.add("sathish");
    names.add("Ravi");
    names.add("Praksh");
    names.add("pavithara");
    names.add("Duraga");
    names.add("uma");
    names.add("Upendar");
    System.out.println("Before sorting");
    System.out.println("Names : "+names);
    Collections.sort(names, new Comparator<String>() {

        @Override
        public int compare(String lhs, String rhs) {
            return lhs.compareToIgnoreCase(rhs);//Ascending order.
            //return (lhs.compareToIgnoreCase(rhs)*(-1));//Descending order.

        }
    });
    System.out.println("After sorting");
    System.out.println("Names : "+names);

输出: 排序前

名字:[sathish, Ravi, Praksh, pavithara, Duraga, uma, Upendar]

排序后

名字:[Duraga, pavithara, Praksh, Ravi, sathish, uma, Upendar]

【讨论】:

    【解决方案3】:

    这是对字符串数组进行排序的简单方法:
    Arrays.sort(mystringarray);

    【讨论】:

      【解决方案4】:

      您可以使用ArrayList 代替Array

      请查看this link

      【讨论】:

        【解决方案5】:

        Score 应该是类

        public class HighScore Comparable<HighScore>
        {
            private String name;
            private int score;
        
            public Score( String name, int score )
            {
                 this.name = name; 
                 this.score = score;
            }//cons
        
            //getters
            public String getName() { 
                 return name;
            }//met
        
            public int getScore() { 
                 return score;
            }//met
        
            @Override
            public int compareTo( HighScrore b )
            {
                  int diffScore = score - b.score;
                  if( diffScore != 0)
                      return diffScore;
                  else
                      return name.compareTo( b.name );
            }//met
        
            public boolean equals( Object o )
            {
                 if( !(o instanceof HighScore))   
                     return false;
                 HighScore b = (HighScore) o;
                 return score == b.score && name.equals( b.name );
            }//met
        }//class
        

        然后你就可以构建乐谱对象了,

        String[] stringParts[];
        List<HighScore> listHighScore = new ArrayList<HighScore>();
        for (int i=0; i<array1.size(); i++)
        {
            stringParts =  array1.get(i).split(':'); 
            listHighScore.add( new HighScore( stringParts[ 0 ], Integer.parseInt( stringParts[ 1 ])) );
        
        }//for
        

        将它们放在一个列表中并对其进行排序

        Collections.sort( list );
        

        问候, 斯蒂芬

        【讨论】:

          【解决方案6】:

          使用

          java.util.Arrays.sort(yourArray, new Comparator<String>() {
                  @Override
                  public int compare(String object1, String object2) {
                      return Integer.valueOf(object1).compareTo(Integer.valueOf(object2));
                  }
              });
          

          Comparator 会将您的字符串作为整数进行比较。

          【讨论】:

          • 答案是转换为数字以按数字排序 - 如果不是,如果您将它们保留为字符串 +1,则按词汇顺序排序
          【解决方案7】:

          您最好将名称 + 结果存储在对象中,然后将它们存储在 ArrayList 中。然后,您可以使用自定义比较器非常轻松地进行排序,请参阅链接以获取简单示例:http://www.javabeat.net/tips/20-sorting-custom-types-in-java.html

          【讨论】:

            【解决方案8】:

            如果可能为您的问题使用更好的数据结构,请使用 HashMap,使用名称到评分映射,并使用值对 hashmap 进行排序。
            如果您想按照您的描述使用arraylist,在排序之前,将它们转换为整数并排序,然后返回字符串。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-02-18
              • 2018-07-11
              相关资源
              最近更新 更多