2012-01-01 13 views
3

StringListを含むaccountというArrayListがあります。私は彼らが順序であるかどうかをチェックし、順序どおりであるかどうかに基づいて真または偽を返すメソッドを記述しようとしています。Java - 文字列のArrayListがアルファベット順であるかどうかをチェック

どうやってこれをやりますか?私はすでにfor-loopで最初のchracterをチェックしようとしましたが、それはひどく間違っていました。私は新しいArrayListを作成し、それを元のものと等しく設定し、並べ替えて比較しましたが、同じデータが含まれていたので常に元に戻りました。

私はStringsのためにこれをやっているので、いくつかの数字が昇順か降順かを確認するにはどうすればよいですか?同じプリンシパルですか?

ありがとうございました!

+0

http://stackoverflow.com/questions/3047051/how-to-determine-if-a-list-is-sorted-in- Javaの 'String#compareTo(String)'メソッドのjavadocと組み合わせると、 – Robin

+1

になります。String.compareToを使用しても*アルファベット順は意味しません。 compareToIgnoreCaseまたは 'java.text.Collat​​or'のいくつかのバージョンが必要です – bestsss

+0

正しい答えは、実際にメソッドを書くか、リストがソートされているかを調べる必要があるかどうかによって異なります。2番目のケースでは、実際にメソッドを記述したり、GuavaのOrderingクラス(詳細については私の答えを見てください)のような外部ライブラリを使用することなく、あなたは一番です。ちょうどホイールの別の作者ではありません:) –

答えて

10

(あなたはもちろん、彼らの自然順序付けを使用して文字列を比較したいと仮定して)これを試してみてください自然順序付け。

+3

私はあなたの読書専用のforeachループの 'final'が好きです – dantuch

+0

@dantuch、finalの多くはC++のconstを酷使していますが、いつかはコードに苦痛を与えます(Javaでは少なくとも強制することはできません) – bestsss

+0

@bestsss that'sコーディングスタイルの問題、いつものように – fge

2

私はforループがこれに適していると思います。私が取るアプローチは、各単語を前のものと照らし合わせ、正しいアルファベット順であるかどうかを確認することです。最善のケースは、リストが順序どおりであることを判断するための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クラスのsortメソッドを使用します。

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

は、指定されたリストを昇順にソートしますその要素の自然順序付けに従って、 。

6

あなたは外部ライブラリ(グアバ)を使用してもかまわない場合Ordering行います:

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

これはStringや他のComparablesのために尽くします。カスタムタイプの注文を確認する場合は、Orderingクラスの静的ファクトリメソッドを使用するか、サブクラス化してください。大文字と小文字を区別しない発注用

編集

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

コンパレータを使用してアルファベット順に動作しません。 – bestsss

+1

@bestsssの通りですが、受け入れられた答えを見ると、Stringの自然順序付けはOPによって実際に意味されていました。私はとにかく私の答えにメモを追加しています。 –

関連する問題