【问题标题】:How to sort an array of strings alphabetically by second word in Java如何按Java中的第二个单词按字母顺序对字符串数组进行排序
【发布时间】:2013-03-04 20:42:36
【问题描述】:

我正在处理的任务有一点问题。基本上,我有一个文件,其中包含学生 ID 和他们的名字,格式如下:

17987 贝丝

17950 克拉克

17936 亚伦

我将文件的内容放在一个数组中,我需要按名称而不是 ID 对其进行排序。如果我使用Arrays.sort(myArray),它将自动按 ID 对其进行排序。我很难理解比较器,所以如果你能一步一步地解释它,对我来说会更容易。 谢谢!

【问题讨论】:

  • 你是如何阅读学生的?你把它们存放在哪里?
  • 我会使用 TreeSet,请参阅 [this question/answer][1]。 [1]:stackoverflow.com/questions/922528/…
  • 您始终可以使用选择排序或其他一些简单的排序算法手动对其进行排序。
  • 您的阵列中目前有什么?整个字符串17987 Beth,或者你至少把它分成两部分 - id和name?

标签: java arrays string sorting


【解决方案1】:

您需要提供一个Comparator 来查看传递给它的Strings,并且他们必须了解他们要查找的内容。您可以通过几种不同的方式执行此操作,但是,如果您确定字符串的内容,那么您可以根据它们的空间 splitStrings 并比较第二个值。或者,您可以使用正则表达式来提取这些详细信息。

class SecondWordComparator implements Comparator<String>
{
    @Override
    public int compare(String s1, String s2)
    {
        String[] a1 = s1.split(" ");
        String[] a2 = s2.split(" ");

        // you should ensure that there are actually two elements here
        return a1[1].compareTo(a2[1]);
    }
}

【讨论】:

  • 谢谢您,pickypg 的快速回复。它就像一个魅力!
【解决方案2】:

使用TreeMap,条目将按键排序。

例如:

SortedMap<String, Integer> srtdMap  = new TreeMap<String, Integer>();

srtdMap.put("Beth", 17987);
srtdMap.put("Aaron", 17936 );
srtdMap.put("Clark", 17950);

//key set always returns the same order by name
for(String name : srtdMap.keySet())
{
    int id = srtdMap.get(name);
    System.out.println("name = " + name + ", ID is " + id);
}

【讨论】:

  • 你需要翻转 TreeMap 的顺序,因为他想把它排在 String 而不是 Integer 之后。
【解决方案3】:

您可以做的是运行一个 for 循环,将 Array 的所有内容重新排列到最终数组中。需要两个 for 循环。第一个 for 循环将遍历 Array,第一个内的 for 循环将查找第一个字母并将其添加到最终的 Array/Arraylist 中。

【讨论】:

    【解决方案4】:

    对于面向对象的方法,我会将文件解析为一个新类Student,并将它们保存在一个数组(列表)中。该类可以扩展Comparable&lt;Student&gt; 在那里,您可以将int IDString name 分开,并让compareTo(Student student) 方法返回name.compareTo(otherStudent.name)。然后你可以调用 sort 方法,它会根据需要对其进行排序。

    这样:

    public class Student implements Comparable<Student> {
        private int id;
        private String name;
        public Student(int id, String name) {
            this.id = id;
            this.name = name;
        }
        @Override
        public int compareTo(Student student) {
            return name.compareTo(student.name);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多