2012-01-01 2 views
3

문자열이 들어있는 account라는 ArrayList가 있습니다. 순서가 맞는지 여부를 확인하고 순서가 맞는지 여부에 따라 true 또는 false를 반환하는 메서드를 작성하려고합니다.자바 - 문자열의 ArrayList가 알파벳 순서인지 확인

어떻게 하시겠습니까? 나는 for-loop로 초기 chracter를 검사 해 보았지만 이미 잘못되었다. 새로운 ArrayList를 만들고 원래와 동일하게 설정 한 다음 정렬하고 비교했습니다.하지만 동일한 데이터가 포함되어 있기 때문에 항상 원래대로 돌아 왔습니다.

문자열에 대해이 작업을 수행하기 때문에 추가 질문이 간단합니다. 어떤 숫자가 오름차순/내림차순인지 확인하는 방법은 무엇입니까? 같은 교장 선생님?

고마워요!

+0

http://stackoverflow.com/questions/3047051/how-to-determine-if-a-list-is-sorted-in- 자바가'String # compareTo (String)'메소드의 javadoc와 결합하면 – Robin

+1

을 얻을 수 있습니다 : String.compareTo를 사용하는 것은 * 알파벳 순서를 의미하지 않습니다. compareToIgnoreCase 또는'java.text.Collator'의 일부 버전이 필요합니다. – bestsss

+0

올바른 답은 실제로 "메소드 작성"또는 "목록 정렬 여부 확인"여부에 달려 있습니다.두 번째 경우에는 실제로 메서드를 작성하지 않고 Guava의 Ordering 클래스와 같은 외부 라이브러리를 사용하지 않는 것이 가장 좋습니다 (자세한 내용은 내 대답 참조). 그냥 바퀴의 다른 저자가되지 않습니다 :) –

답변

10

(당신은 물론, 자연 순서를 사용하여 문자열을 비교하려는 가정)이 시도 자연 질서. 그들은 순서에있는 경우

+3

나는 당신의 읽기 전용 foreach 루프에서'final'을 좋아한다. – dantuch

+0

@dantuch, final은 C++에서 const를 과용 한 것을 연상케한다. 언젠가는 코드에 고통을 준다. (자바에서는 적어도 시행 할 수 없다.) – bestsss

+0

@bestsss that 's 코딩 스타일의 문제, 언제나처럼 – fge

2

for 루프는 for this가 적합하다고 생각합니다. 내가 취하는 접근법은 각 단어를 이전 단어와 비교하여 올바른 알파벳 순서인지 확인하는 것입니다. 가장 좋은 경우는 O (2)가 목록의 순서가 잘못되었다는 것을 결정하기위한 것이고, 최악의 경우 O (n)는 목록이 순서에 있음을 알리는 것입니다.

편집 : 위의 대답은 위의 설명 된 코드에 대한 설명입니다.

String previous = ""; // empty string: guaranteed to be less than or equal to any other 

for (final String current: thelist) { 
    if (current.compareTo(previous) < 0) 
     return false; 
    previous = current; 
} 

return true; 

StringComparable<String>을 구현하고 비교가 문자열을 사용하여 수행 할 것이라는 사실에 기인한다 :

+0

+1 적절한 실행 시간의 경우. 이 작업을 수행하려면 String 클래스의 compareTo() 메서드를 사용하는 것이 좋습니다. 이것은 'Integer','Long','Double' ... 등과 같은 숫자 클래스에 대해서도 똑같이 작동합니다. –

0

그냥 루프를 사용하고 확인 :

boolean isSorted = true; 
for(int i = 0; i < list.size() - 1; i++) { 
    // current String is > than the next one (if there are equal list is still sorted) 
    if(list.get(i).compareToIgnoreCase(list.get(i + 1)) > 0) { 
     isSorted = false; 
     break; 
    } 
} 
0
ArrayList<String> initial = // smth 
ArrayList<String> copy = // copy initial list here 
Collections.sort(initial); 
return initial.equals(copy); 
+0

당신이'list'에 9 999 999 문자열을 가지고 있다고 가정하면, 각각은 길고, 처음 몇개의 요소들 후에 루프 안의''if''만으로 정렬되지 않았다고 말할 수 있습니다. 더 빨리 갈 수 없을까요? ;) – dantuch

+0

간단한 해결책이 아닙니다. 모두 귀하의 필요에 따라 다릅니다. – mishadoff

0

사용 Collection 클래스의 정렬 방법 : 오름차순으로

List<String> list = new ArrayList<String>(); 
//Add Elements 
Collections.sort(list); 

정렬 지정된리스트 , 그 요소의 자연 순서대로 에 따르면.

6

외부 라이브러리 (구아바)를 사용하여 괜찮다면 Ordering 할 것 : 이것은 String 및 기타 Comparables 위해 할

boolean isSorted = Ordering.natural().isOrdered(list); 

. 사용자 정의 유형의 순서를 확인하는 경우 Ordering 클래스의 정적 팩토리 메소드를 사용하거나 클래스를 서브 클래스 화하십시오. 대소 문자를 구별 주문 사용

편집 :

boolean isSorted = Ordering.from(String.CASE_INSENSITIVE_ORDER).isOrdered(list); 
+0

비교기를 사용하여 '알파벳순'순서로 작동하지 않습니다. – bestsss

+1

@bestsss 맞습니다.하지만 허용 된 답변을 살펴보면 String의 자연 순서는 실제로 OP가 의미합니다. 어쨌든 내 답변에 메모를 추가하고 있습니다. –