java - 根据最后一个字母表按字典顺序对字符串数组进行排序 - 字符串索引超出范围 -1 异常

标签 java arrays sorting

package mediumchallenge;

import java.util.Arrays;
import java.util.Comparator;

public class sortarrayofstringsbylength{

    private static class comparelengths implements Comparator<String>{

        @Override
        public int compare(String arg0, String arg1) {
            // TODO Auto-generated method stub
            return (arg0.length()- arg1.length());
        }
    }

    private static class lastchar implements Comparator<String>{

        @Override
        public int compare(String s1, String s2) {
            // TODO Auto-generated method stub
            return (s1.charAt(s1.length()-1) - s2.charAt(s2.length()-1));
        }
    }

    public static void main(String args[]){
        String arr[] = {"abd" , "abc","y" , "rtyuodfdjfhd","weq","wge",""};
        Arrays.sort(arr);
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }

        // sorts according to length of string  
        Arrays.sort(arr, new comparelengths());
        for(int j=0;j<arr.length;j++){
            System.out.println(arr[j]);
        }
        //sorts lexicographically according to last letter  
        Arrays.sort(arr, new lastchar());
        for(int k=0;k<arr.length;k++){
            System.out.println(arr[k]);
        }
    }
}

我正在尝试使用比较器根据每个字符串的最后一个字符对字符串数组进行排序。它给了我字符串索引超出范围 -1 异常

最佳答案

解决方案是检查长度本身是否为零。

  • 如果 s2为空且 s1不为空,s2应该落后于s1所以我们返回-1 .
  • 如果 s1为空且 s2不为空,s1应该落后于s2所以我们返回1 .
  • 如果 s2为空且 s1是空的,它们是equal我们应该返回 0 .

下面是此类实现的示例:

@Override
public int compare(String s1, String s2) {

// Returns a negative integer, zero, or a positive integer 
// as the first argument is less than, equal to, or greater than the second.

                if(s1.length() == 0 && s2.length() > 0)return 1; 
                if(s2.length() == 0 && s1.length() > 0)return -1; 
                if(s2.length() == 0 && s1.length() == 0)return 0; 

                return (s1.charAt(s1.length()-1) - s2.charAt(s2.length()-1));
            }

基本上,您需要决定是否允许空字符串以及遇到它们时采取什么操作(例如将它们推到下面)。

如果您希望首先使用空字符串:

if(s1.length() == 0 && s2.length() > 0)return -1; 
if(s2.length() == 0 && s1.length() > 0)return 1; 
if(s2.length() == 0 && s1.length() == 0)return 0; 

如果您希望最后使用空字符串:

if(s1.length() == 0 && s2.length() > 0)return 1; 
if(s2.length() == 0 && s1.length() > 0)return -1; 
if(s2.length() == 0 && s1.length() == 0)return 0; 

关于java - 根据最后一个字母表按字典顺序对字符串数组进行排序 - 字符串索引超出范围 -1 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247573/

相关文章:

php - 如何在 PHP 中按键对 3 维数组进行排序

java - struts2 - 为什么要使用声明式验证?

java - 一个迭代器,它改变并返回相同的对象。不好的做法?

java - 在 Java 中,如何知道 "synchronized"代码花费了多少时间?

python - 为什么 itertools.groupby 可以将 NaN 分组在列表中而不是在 numpy 数组中

Java - 可以在数组中添加一个 int 和一个 String 吗?

c++ - "Does not name a type"错误,即使我在分配值之前声明正确

Angular 5 按日期排序

java - Z3 求解器 Java API : Unexpected behaviour

javascript - 使用 JavaScript/jQuery 对一组列表元素进行排序和分隔