Как я сортирую ArrayList лексикографически?

Я пытаюсь отсортировать ArrayList Строк, которые представляют значения карты. Так, некоторые карты содержат буквы ("Король"), и некоторые содержат Строки, содержащие только номер ("7"). Я знаю для использования Collections.sort, но он только сортирует Строки, которые содержат буквы. Как я заставляю ArrayList быть отсортированным по числу, а также в алфавитном порядке?

Править: Извините, я, должно быть, не обращал много внимания, когда я посмотрел на сортировку. Вид работает правильно, я, должно быть, был просто отброшен тем, что 10 прибудут перед 2. Спасибо

7
задан Jake 8 June 2010 в 16:24
поделиться

5 ответов

Как я понимаю, у вас есть массив вида ["7", "Queen", "9", "6"] и вы хотите, чтобы после сортировки он выглядел как ["Queen", "9", "7", "6"] (или в обратном порядке).

Я бы посоветовал сделать его более объектно-ориентированным, т.е. создать класс Card с полями name и value:

class Card {
   private final String name;
   private final int value;
   ...
   //constructor and getters
}

и после этого создавать экземпляры таким образом:

Card six = new Card("6", 6);
Card ten = new Card("10", 10);
Card queen = new Card("Queen", 12);

После этого будет гораздо проще делать все операции с карточками (и сортировку в частности), используя поле value вместо имен карточек.

4
ответ дан 6 December 2019 в 15:19
поделиться

Как сказал @Jon Skeet, встроенная сортировка будет сравнивать на основе значений Unicode. Вам придется написать свой собственный метод сортировки.

Однако, раз уж вы пишете свой собственный код, могу ли я предложить перечисление? Колода карт - один из канонических примеров использования перечислений. Краткая версия заключается в том, что вы можете объявить свой собственный порядок сортировки для группы вещей; вы даже можете сделать так, чтобы пиковый король опережал бубнового короля, если захотите. Посмотрите учебник Sun здесь.

1
ответ дан 6 December 2019 в 15:19
поделиться

Сортировка - сортировка всего в соответствии с вашей кодировкой. Другими словами, все числа будут стоять перед буквами в лексикографическом порядке. Например, десятичные числа начинаются с символа "." и не в порядке лексикографически.

Если вы хотите изменить это, создайте объект Comparator. Затем вы можете расположить элементы в любом порядке.

Например, это будет отсортировать числа в числовом порядке, а также слова в лексическом порядке:

class CardComparator extends Object implements Comparator{
 public int compare(Object a, Object b){
  try{
   double d1=Double.valueOf(a.toString());
   try{
     double d2=Double.valueOf(b.toString());
     return (d2>d1)?1:-1;            // both numeric
   }catch(NumberFormatException e){ // a is numeric but b isn't
     return 1;
   }
  }catch(NumberFormatException e){  
    try{
     double d2=Double.valueOf(b.toString()); 
     return -1;                       // a is nonnumeric but b is
    }catch(NumberFormatException e){  // both nonnumeric
      return a.toString().compareTo(b.toString);
    }
  }
 }
}
Comparator comparator=new CardComparator();
Collections.sort(cards, comparator);

PS не проверено!

0
ответ дан 6 December 2019 в 15:19
поделиться

Нет, Collections.sort будет сортировать все, используя порядковое лексикографическое сравнение Unicode, так как это поведение String.compareTo. "7" окажется перед "King", а "10" - перед "2".

9
ответ дан 6 December 2019 в 15:19
поделиться

Я знаю, что нужно использовать Collections.sort, но он сортирует только строки, содержащие буквы. Как сделать так, чтобы ArrayList сортировался по номерам и по алфавиту?

Если строка является номером, то она уже сортируется (как строка), смотрите:

import java.util.*;
class Sort {
    public static void main( String [] args  ) {
        List list = Arrays.asList("Kings","7", "Abcd", "3.1416");
        Collections.sort( list );
        System.out.println( list );
    }
}

Prints

$ java Sort
[3.1416, 7, Abcd, Kings]

Это то, что вам нужно?

edit

Если предположить (догадаться), что вам нужно отсортировать колоду карт, в которой есть и числа, и "буквы" (J, Q, K, A), то можно попробовать использовать пользовательский компаратор.

Вот один из них, который учитывает числа "как числа", а остальное как строки, так что "10" идет после "2", но перед "Королями"

import java.util.*;
class Sort {
    public static void main( String [] args  ) {

        List<String> list = Arrays.asList("Kings","7", "Queen", "3", "10", "A", "2", "8", "Joker");
        Collections.sort( list , new Comparator<String>(){
            public int compare( String a, String b ){
                // if both are numbers
                if( a.matches("\\d+") && b.matches("\\d+")) {
                    return new Integer( a ) - new Integer( b );
                }
                // else, compare normally. 
                return a.compareTo( b );
            }
        });
        System.out.println( list );
    }
}

$ java Sort
[2, 3, 7, 8, 10, A, Joker, Kings, Queen]

Если это то, что вам нужно, я думаю, это поможет вам разобраться с остальным. Вероятно, следующим будет то, как сортировать пики и червы.

Следуя ответу Roman, вы можете создать класс и реализовать интерфейс Comparable:

  class Card implements Comparable<Card> {
       public int compareTo( Card other ) {  
           // add custom logic to compare one card with other 
       }
   }
0
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: