2016-11-25 37 views
2

在情況下,我有一個字符串以下列格式的陣列 -如何在Java中對字符串數組(以數字連接的名稱形式)進行排序?

[ 「synthia 16」, 「艾麗西亞3」, 「艾麗西亞2」, 「艾麗西亞1」, 「synthia 2」]

該清單首先按名稱排序,然後是以下數字。排序的輸出應爲─

[ 「艾麗西亞1」, 「艾麗西亞2」, 「艾麗西亞3」, 「synthia 2」, 「16 synthia」]

我用comaparator做這使用Java:

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

public class SortList { 

public static void main (String[] args) { 
    String[] names = {"synthia 16", "alicia 4", "alicia 19", "alicia 1", "synthia 2"}; 
    System.out.println("Unsorted list:\n ");   
    displayList(names); 

    Arrays.sort(names, new nameComparator()); 
    System.out.println("\nSorted list:\n"); 
    displayList(names); 
} 

public static void displayList(String[] names) { 
    for(String name:names) { 
     System.out.println(name); 
    } 
} 

private static class nameComparator implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2) { 
     String[] s1NameNumPair = s1.split(" "); 
     String[] s2NameNumPair = s2.split(" "); 
     if (s1NameNumPair[0].compareTo(s2NameNumPair[0]) > 1) { 
      return 1; 
     } else if (s1NameNumPair[0].compareTo(s2NameNumPair[0]) < 1) { 
      return -1; 
     } else { 
      Double n1 = Double.parseDouble(s1NameNumPair[1]); 
      Double n2 = Double.parseDouble(s2NameNumPair[1]); 
      if (n1 > n2) { return 1; } 
      else if (n1 < n2) { return -1; } 
      else { return 0; }     
     } 
    } 
} 
} 

但是,像這樣使用比較器只按名稱的字母順序排列數組。以下是此代碼生成的輸出:

Unsorted list: 

synthia 16 
alicia 4 
alicia 19 
alicia 1 
synthia 2 

Sorted list: 

alicia 1 
alicia 19 
alicia 4 
synthia 2 
synthia 16 

如何才能獲得正確的排序輸出?

+0

相關:[比較和thenComparing給出編譯錯誤](http://stackoverflow.com/questions/40500280/comparing-and-thencomparing-gives-compile-error )。 –

回答

4

您必須檢查> 0< 0使== 0會去別的, 試試下面

if (s1NameNumPair[0].compareTo(s2NameNumPair[0]) > 0) { 
    return 1; 
} else if (s1NameNumPair[0].compareTo(s2NameNumPair[0]) < 0) { 
    return -1; 
} else { 
    Double n1 = Double.parseDouble(s1NameNumPair[1]); 
    Double n2 = Double.parseDouble(s2NameNumPair[1]); 
    return n1.compareTo(n2); 
} 
2

更改nameComparator這個:

private static class nameComparator implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2) { 
     String[] s1NameNumPair = s1.split(" "); 
     String[] s2NameNumPair = s2.split(" "); 
     int diff = s1NameNumPair[0].compareTo(s2NameNumPair[0]); 

     if (0 == diff) { 
      Double n1 = Double.parseDouble(s1NameNumPair[1]); 
      Double n2 = Double.parseDouble(s2NameNumPair[1]); 

      return n1.compareTo(n2); 
     } 

     return diff; 
    } 
} 
+0

嗨,這工作。你能否解釋一下這與我實施的不同?它似乎在做同樣的事情。讓我知道我錯過了什麼。 – Rookie

+0

在'if'和'else if'語句中,應該將其與0進行比較。 String和Double已經存在'compareTo()'方法返回int。 因此,您不必再次比較此方法返回的值。 –

1

請更改如下比較。

private static class nameComparator implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2) { 
     String[] s1NameNumPair = s1.split(" "); 
     String[] s2NameNumPair = s2.split(" "); 
     if (s1NameNumPair[0].compareTo(s2NameNumPair[0]) > 1) { 
      return 1; 
     } else if (s1NameNumPair[0].compareTo(s2NameNumPair[0]) < 0) { //here it should be <0 not <1 
      return -1; 
     } else { 
      Double n1 = Double.parseDouble(s1NameNumPair[1]); 
      Double n2 = Double.parseDouble(s2NameNumPair[1]); 
      if (n1 > n2) { 
       return 1; 
      } else if (n1 < n2) { 
       return -1; 
      } else { 
       return 0; 
      } 
     } 
    } 
} 
1

您可以使用這樣的比較:

  1. 的Java 7

    Comparator<String> comparator = new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
        String[] strings1 = o1.split("\\s+"); 
        String[] strings2 = o2.split("\\s+"); 
        int firstCompare = strings1[0].compareTo(strings2[0]); 
        int secondCompare = Integer.valueOf(strings1[1]).compareTo(Integer.valueOf(strings2[1])); 
    
        return firstCompare*2 + secondCompare; 
    } 
    

    };

  2. 爪哇8

    Comparator<String> comparator = 
    (String o1, String o2)-> { 
        String[] strings1 = o1.split("\\s+"); 
        String[] strings2 = o2.split("\\s+"); 
        int firstCompare = strings1[0].compareTo(strings2[0]); 
        int secondCompare = Integer.valueOf(strings1[1]).compareTo(Integer.valueOf(strings2[1])); 
    
        return firstCompare*2 + secondCompare; 
    }; 
    
相關問題