按字典顺序对字符串数组进行排序 - 字符串索引超出范围-1异常

时间:2014-01-21 01:40:02

标签: 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异常

2 个答案:

答案 0 :(得分: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; 

答案 1 :(得分:0)

String arr [] = {“abd”,“abc”,“y”,“rtyuodfdjfhd”,“weq”,“wge”,“”};

最后一个元素是“”,它的长度为零。 代码“s1.charAt(s1.length() - 1)”将抛出String索引超出范围-1异常。