【问题标题】:Sorting a String Array using a Comparator based on a Character in the String使用基于字符串中的字符的比较器对字符串数组进行排序
【发布时间】:2017-09-01 15:56:45
【问题描述】:

所以我尝试使用比较器对字符串数组进行排序,但排序是基于字符串的长度,然后是字符串的第三个字符。

到目前为止,这是我的比较器:

class StringSorter implements Comparator<String> {
    public int compare(String s1, String s2) {
        if(s1.length() < s2.length()) {
            return -1;
        }
        if(s1.length() > s2.length()) {
            return 1;
        }    
        return s1.charAt(3)+"".compareTo(s2.charAt(3)+"");
    }
}//Comparator

这一行 return s1.charAt(3)+"".compareTo(s2.charAt(3)+""); 是我迄今为止的尝试,我得到了 IndexOutOfBoundsException 但我的数组中的每个字符串的长度至少为 4,所以我不明白为什么会出错。

至于我的问题,为什么我会收到这个错误?如果我要根据长度和字符串中的字符进行排序,那我应该如何编写比较器?

编辑:我需要处理的数组遵循这种格式

{"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"}

【问题讨论】:

  • 您的问题需要可验证,因此请提供示例输入
  • "但我的数组中的每个字符串的长度至少为 4,所以我不明白为什么会出错。"这是错误的,否则你不会有例外。设置断点并以调试模式或其他方式运行:如果字符串长度超过 4,则添加检查并抛出异常。
  • 观察:compareTo 是否被 ""s1.charAt(3)+"" 调用?也许这里有有趣的顺序优先权。
  • 请注意,您的代码可以简化为Comparator&lt;String&gt; c = Comparator.comparingInt(String::length).thenComparingInt(s -&gt; s.charAt(3));
  • 无需全部转换为字符串等。只需使用-new Character(s1.charAt(2)).compareTo(s2.charAt(2))

标签: java arrays string sorting comparator


【解决方案1】:

您的代码运行良好。我在此处对其进行了一些调整,以向您展示如何使其更具弹性。

class StringSorter implements Comparator<String> {
    private final int pos;

    public StringSorter(int pos) {
        this.pos = pos;
    }

    public int compare(String s1, String s2) {
        if (s1.length() < s2.length()) {
            return -1;
        }
        if (s1.length() > s2.length()) {
            return 1;
        }
        if ( s1.length() <= pos ) {
            return s1.compareTo(s2);
        }
        return Character.compare(s1.charAt(pos),s2.charAt(pos));
    }
}

public void test() {
    String[] test2 = {"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"};
    System.out.println("Before: " + Arrays.toString(test2));
    Arrays.sort(test2, new StringSorter (2));
    System.out.println("After:  " + Arrays.toString(test2));
}

打印:

之前:[1:bbbbb, 2:aaa, =:ccc, 1:qqqq, 1:eeee, =:zzz, 1:vvv, 2:oooo, =:eee, 1:fffff]

之后:[2:aaa, =:ccc, =:eee, 1:vvv, =:zzz, 1:eeee, 2:oooo, 1:qqqq, 1:bbbbb, 1:fffff]

我怀疑您使用的是3,意思是第三个字符-这是错误的。 3rd 字符位于2 位置;

记住 - 字符串中的第 n 个字符由 [n-1] 索引,因为第一个字符位于 0

【讨论】:

    【解决方案2】:

    这是使用三元运算符解决问题的方法。

    简单的单线比较法。

    class StringSorter implements Comparator<String> {
    
        @Override
        public int compare(String s1, String s2) {
            return s1.length() - s2.length() != 0 ? s1.length() - s2.length() :  new Character(s1.charAt(2)).compareTo(s2.charAt(2));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多