2016-11-25 4 views
2

В случае, у меня есть массив строк в следующем формате -Как отсортировать массив строк (в виде имен, объединенных с числами) в Java?

[ "Synthia 16", "Алисия 3", "Алисия 2", "Алисия 1", "Synthia 2"]

Список должен быть отсортирован по имени сначала, а затем следующий номер. Выход сортировки должен быть-

[ "Алисия 1", "Алисия 2", "Алисия 3", "Synthia 2", "Synthia 16"]

Я использовал 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. Существует уже существующий метод compareTo() 'для String и Double, который возвращает 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. Java 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; 
    };