2010-06-08 3 views
6

카드 값을 나타내는 String의 ArrayList를 정렬하려고합니다. 따라서 일부 카드는 문자 ("King")를 포함하고 일부는 숫자 ("7") 만 포함하는 문자열을 포함합니다. 나는 Collections.sort를 사용하는 것을 알고 있지만 글자가 들어있는 Strings 만 정렬한다. ArrayList를 알파벳 순으로뿐만 아니라 숫자 순으로 정렬하려면 어떻게합니까?어떻게 사전 식으로 ArrayList를 정렬합니까?

편집 : 죄송합니다. 정렬을 살펴볼 때 많은 관심을 기울여서는 안되었습니다. 정렬이 올바르게 작동하면 10이 2 전에 올 것입니다. 감사합니다.

+1

"Collections.sort를 사용하는 것을 알고 있지만 글자가 포함 된 문자열 만 정렬합니다."어? – leonbloy

+1

당신이하려는 것을 모를 경우, 콜렉션을 정렬하면 모든 것을 알파벳 순으로 정렬합니다 ("7"포함). 숫자는 A 앞에 놓여 지므로 맨 위에 올 것입니다. "s"아래에 7을 저장하려면 표시 문자열 "7"과 코드/텍스트 표현 "7"이있는 일반 모음 사전 클래스와 같은 사전을 만들어야합니다. 그런 식으로. – Cobusve

답변

9

아니요, Collections.sortString.compareTo의 동작이므로 유니 코드 서수 사전 비교를 사용하여 모든 항목을 정렬합니다. "7"은 "King"앞에 올 것이며, "10"은 "2"앞에옵니다.

+0

예 - http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String) – leonbloy

0

나는 Collections.sort를 사용하는 것을 알고 있지만 글자가 들어있는 문자열 만 정렬합니다. ArrayList를 알파벳 순으로뿐만 아니라 숫자 순으로 정렬하려면 어떻게합니까?

문자열이 이미 분류되고있는 번호 (AN String로서 비록) 볼 경우 :

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); 
    } 
} 

인쇄

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

당신이 무엇을 필요가 있습니까? 당신이 숫자와 "문자"모두가 카드의 데크를 정렬하는 것입니다 필요 (추측) 가정

편집

(J는 Q는, K, A) 사용자 정의를 사용하려고 할 수 있습니다 비교기. 즉 당신은 내가 생각해야 할 것입니다 경우

다음은 "왕"

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] 

전에 고려 "숫자로"숫자 문자열로 나머지를 필요 하나, 그래서 "10", "2"다음에 오는 있지만, 이것은 당신이 나머지를 파악하는 데 도움이 될 것입니다. 아마도 스페이드와 하트를 어떻게 분류 할 것인가가 그 다음 일 것입니다.

당신이 클래스를 생성하고 Comparable 인터페이스를 구현할 수 Roman하여 답을 다음과 같습니다

class Card implements Comparable<Card> { 
     public int compareTo(Card other) { 
      // add custom logic to compare one card with other 
     } 
    } 
+0

그가 묻는 것이 아닙니다. 모든 카드 이름에 대해 사용자 지정 Comparator를 작성하길 원합니다. –

+0

@Nikita : 나는 그가 "생각하다"는 숫자가 그 종류에 포함되어 있지 않다는 것을 이해한다. 아마도 영업 사원은 명확한 설명이 필요합니다. – OscarRyz

0

정렬이 캐릭터 세트에 따라 모든 정렬합니다. 즉, 모든 숫자는 사전 편집 순서에 따라 문자 앞에옵니다. 예를 들어 십진수는 '.'로 시작합니다. 순서가 바뀌 었습니다.

이 값을 변경하려면 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는 테스트하지!

1

@ Jon Skeet이 말했듯이 기본 제공 정렬은 유니 코드 값을 기반으로 비교됩니다. 당신은 당신 자신의 정렬 방법을 써야 할 것입니다.

내가 직접 코드를 작성하는 한, 열거 형을 제안 할 수 있습니까? 카드 덱은 열거 형의 사용에 대한 표준적인 예 중 하나입니다. 짧은 버전은 사물의 그룹에 대한 자신 만의 정렬 순서를 선언 할 수 있다는 것입니다. 원한다면 스페이드의 왕보다 다이아몬드의 왕을 능가하게 만들 수도 있습니다. 썬의 튜토리얼 here을 확인하십시오.

4

내가 이해 한대로 ["7", "Queen", "9", "6"]과 같은 배열이 있으며 정렬이 완료된 후 ["Queen", "9", "7", "6"] (역순으로) 표시되기를 원합니다.

내가 할 권하고 싶습니다 그것을 좀 더 객체 지향 즉 필드 이름과 값을 클래스 카드를 만들 :

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

:

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

하고이 방법으로 인스턴스를 생성 한 후

그 후 카드 이름 대신에 value 필드를 사용하여 카드로 모든 작업을 (그리고 특히 정렬하여) 훨씬 쉽게 할 수 있습니다.

+1

''대회로, 카드에는 일반적으로 "슈트"가 있습니다. '' – fmark