2016-04-16 14 views
0

私は既にアルファベット順の文字列のリストを持っています。ここでは、ユーザーがアルファベット順に項目を入力すると仮定します。文字列を配列に順番に挿入

クラス内の文字列アイテムのリストと、他の文字列オブジェクトを渡して配列に挿入できるメソッドがあります。

String[] strings = new Strings[0]; 

public void add(String a){ 
//here the current list is resized and we need to add the new item 
Strings[] newSizedList = new String[strings.length+1]; 
//for loop here to copy items over into the new resized array. 
} 

問題は、リストが既にアルファベット順であると想定されています。私がする必要があるのは、渡された文字列を配列の正しい位置に挿入し、他の項目をアルファベット順に保つことです。

私は「並べ替えアルゴリズム」を使用したくないという制約があります。言い換えれば、私はリスト全体を一度に並べ替えて並べる必要はありません。

私はアイテムがすでに存在しているので、それを保持するために、現在のアイテムをリストのそれぞれの位置に挿入します。

I任意のコレクションの静的メソッドまたはJavaコレクションクラスを使用することはできません静的メソッド

誰もこれを行うことができる方法を知っていますか?

+0

あなたはは、Arrays.sortを(使用後、任意の位置にあなたの文字列を挿入する)か、配列http://stackoverflow.com/questions/12986386をソートするためにあなたの方法を実装したい場合は、この記事を見てみることができ/ sorting-array-of-java – esprittn

答えて

1

あなたはとにかくforループで配列のクローンを作成しようとしているので、(あなたはそれはオプションではありません言ったように良いニュースでなければなりません)ここにソートのいずれかの種類を実行する必要はありません。アイテムを取りに行くときに、正しい場所に新しいアイテムを挿入するだけです。

//for loop here to copy items over into the new resized array. 
//We use two counters here, ii for the old list and i for the new 
int ii = 0, nn = strings.length; 
for(int i = 0, n = newSizedList.length; i < n; i++) { 

    if(ii != nn && (ii != i || strings[ii].compareTo(a) < 0)){ 
     //The item in newSizedList[i] will be taken from the original list if 
     //we have not already taken all the items from there (ii != nn) and 
     //a) we have already inserted the new item (ii != i) 
     //or b) a is alphabetically "greater" than the corresponding item in original array 
     newSizedList[i] = strings[ii]; 
     ii++;//Keep the other counter in sync 
    } else { 
     //Otherwise, this is the place for the new item 
     newSizedList[i] = a; 
    } 

} 
+0

渡されたアイテムのリストがあり、上記の同じアルゴリズムを使用して、渡されたリストにアルファベット順にこれらのアイテムを入力したい場合はどうなりますか? – user1664285

+0

残念ながら、それは問題に相当な複雑さを加えるので、このスニペットにもいくつかの変更が必要です。例えば、 'i!= ii'テストはうまくいかず、配列の中のすべての項目との比較を行う必要があります。今は' a'と比較しています。いくつかの変更を加えても可能ですが、配列をソートしたり、SortedSetを使用すると、他の方法と同様に多くの問題を軽減できます。 1つの項目だけを挿入する作業は非常に簡単なので、このアプローチはここで機能します。 – noppa

+0

私はあなたが何を意味するかを見ます。だから私は、リスト内の各文字列のための上記のメソッドを呼び出すことによって配列内の正しい位置に各文字列を追加するリストをループし、paramとして文字列のリストを取るメソッドを持っています。これは良い解決策のように聞こえますか? – user1664285

0

Arrays.binarySearch正しい挿入ポイントを効率的に見つけるために使用できます。

+0

コレクションの静的メソッドは使用できません – user1664285

+0

この場合は、バイナリ検索アルゴリズムをルックアップし、O(logn)時間内に挿入が必要であると仮定して自分で実装します。 –

0

Arraysクラスの正しいメソッドを呼び出すだけです。

Arrays.sort(newSizedList); 
+0

コレクションの静的メソッドを使用することはできません – user1664285

関連する問題