简体   繁体   English

使用自定义排序对String数组进行排序

[英]Sorting an array of String with custom ordering

I have a String array: 我有一个String数组:

 String[] str = {"ab" , "fog", "dog", "car", "bed"};
 Arrays.sort(str);
 System.out.println(Arrays.toString(str));

If I use Arrays.sort , the output is: 如果我使用Arrays.sort ,输出是:

 [ab, bed, car, dog, fog]

But I need to implement the following ordering: 但我需要实现以下排序:

FCBWHJLOAQUXMPVINTKGZERDYS

I think I need to implement Comparator and override compare method: 我想我需要实现Comparator并覆盖compare方法:

 Arrays.sort(str, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            // TODO Auto-generated method stub
            return 0;
        }
    });

How should I go about solving this? 我该如何解决这个问题?

final String ORDER= "FCBWHJLOAQUXMPVINTKGZERDYS";

Arrays.sort(str, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
       return ORDER.indexOf(o1) -  ORDER.indexOf(o2) ;
    }
});

You can also add: 您还可以添加:

o1.toUpperCase()

If your array is case in-sensitive. 如果您的阵列是不区分大小写的。


Apparently the OP wants to compare not only letters but strings of letters, so it's a bit more complicated: 显然,OP不仅要比较字母而且要比较字母串,所以它有点复杂:

    public int compare(String o1, String o2) {
       int pos1 = 0;
       int pos2 = 0;
       for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) {
          pos1 = ORDER.indexOf(o1.charAt(i));
          pos2 = ORDER.indexOf(o2.charAt(i));
       }

       if (pos1 == pos2 && o1.length() != o2.length()) {
           return o1.length() - o2.length();
       }

       return pos1  - pos2  ;
    }

I would do something like this: 我会做这样的事情:

Put the letters in a HashTable (let's call it orderMap). 将字母放在HashTable中(让我们称之为orderMap)。 Key is the letter, value is the index in ORDER. 键是字母,值是ORDER中的索引。

And then: 然后:

Arrays.sort(str, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
        int length = o1.length > o2.length ? o1.length: o2.length
        for(int i = 0; i < length; ++i) {
           int firstLetterIndex = orderMap.get(o1.charAt(i));
           int secondLetterIndex = orderMap.get(o2.charAt(i));

           if(firstLetterIndex == secondLetterIndex) continue;

           // First string has lower index letter (for example F) and the second has higher index letter (for example B) - that means that the first string comes before
           if(firstLetterIndex < secondLetterIndex) return 1;
           else return -1;
        }

        return 0;
    }
});

For making it case-insensitive just do toUpperCase() to both strings at the beginning. 为了使它不区分大小写,只需在开始时对两个字符串执行toUpperCase()。

Here you can find usefull link: 在这里你可以找到有用的链接:

Using comparator to make custom sort 使用比较器进行自定义排序

In your example instead comparing specific attributes of class you nedd to check possition of char in benchmarked String and base on this check if it's greather/equal/smaller. 在你的例子中,比较你需要的类的特定属性来检查基准字符串中的char的可能性,并基于此检查它是否更好/相等/更小。

Took my time to improve on the selected answer. 花时间改进选定的答案。 This is more efficient 这更有效率

public static void customSort(final String order,String[] array){
String[] alphabets={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"};
    String keyword=order;
    for(int g=0; g<alphabets.length; g++){
    String one=alphabets[g];
    if(!keyword.toUpperCase().contains(one)){keyword=keyword+one;}
    }

final String finalKeyword=keyword;
Arrays.sort(array, new Comparator<String>() {

    @Override
   public int compare(String o1, String o2) {
       int pos1 = 0;
       int pos2 = 0;
       for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) {
          pos1 = finalKeyword.toUpperCase().indexOf(o1.toUpperCase().charAt(i));
          pos2 = finalKeyword.toUpperCase().indexOf(o2.toUpperCase().charAt(i));
       }

       if (pos1 == pos2 && o1.length() != o2.length()) {
           return o1.length() - o2.length();
       }

       return pos1  - pos2  ;
    }
});
//Arrays.sort(array, Collections.reverseOrder());
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM