2017-11-15 4 views
-1

汎用メソッドsmallestValueInArray(T[] array)があり、このメソッドは任意のタイプの配列を取得します。私はこのような何かをしたい主な方法でString Arrayから要素を削除する方法は?重要:配列をリストに変換したくない

public class Helper { 

    public static <T extends Comparable<T>> T smallestValueInArray(T[] array) { 
     T smallestValue = array[0]; 
     T smallerTempValue = array[0]; 

     for (int i = 0; i < array.length - 2; i+=2) { 

      if (array[i].compareTo(array[i+1]) < 0) { 
       smallerTempValue = array[i]; 
      } else { 
       smallerTempValue = array[i+1]; 
      } 

      if (smallestValue.compareTo(smallerTempValue) > 0) { 
       smallestValue = smallerTempValue; 
      } 
     } 
     return smallestValue; 
    } 
} 

:このメソッドは、このようになります

for (int i = 0; i < stringArray.length; i++) { 
     someOtherArray[i] = Helper.smallestValueInArray(stringArray); 
     Helper.deleteElement(stringArray, stringArray[i]); 
    } 

だから私はstringArrayをループにしたい、そのアレイ内の最小の要素を見つけていることを追加要素を新しい配列に追加します。その後、メソッドdeleteElement()を使用したいと考えています。このメソッドは2つのパラメータを取得します。最初は1つの配列、2番目の要素は削除する配列の要素位置です。

私のdeleteElement()メソッドはどのように見えるのですか?

重要:リスト内で配列を変換したいのではなく、list.remove()を使用したい!

+2

* "リスト内で配列を変換したくない" *なぜですか? –

+1

'TL; DR'はどのようにして配列から要素を削除しますか? – Eugene

+0

私のsmallestValueInArray(T []配列)を見てください。配列T []だけを受け入れることができます! –

答えて

5

アレイをListに変換したくない場合は、削除された要素が含まれていない新しいアレイを作成することしか表示されません。 deleteElementメソッドはその配列を返す必要があります。

public static <T> T[] deleteElement(T[] array, int i) 
{ 
    // create new array of length array.length - 1 
    // copy all the elements from the source array except of the i'th element 
    // return the new array 
} 

とあなたがそれを呼ぶことにします:

stringArray = Helper.deleteElement (stringArray, i); 

もちろん、それは番目の要素i」を削除し、ArrayListに配列を変換し、配列に戻って変換することがはるかに簡単になります。

+0

それは悪い考えではありません! –

+0

唯一の問題は、ループ内の元の配列をループし続ける方法です: 'for(int i = 0; i

+0

@NedzadGanicできません。配列のサイズを変更することはできないので、要素を削除する唯一の方法は、新しい小さな配列を作成することです。おそらく、削除するすべての要素を最初に特定すること(たとえば、それらを 'null'に設定すること)を考えて、ループの後で(新しい配列の作成を介して)実際の削除のみを行うことが考えられます。 – Eran

-1

あなたのdeleteElement関数では、与えられたインデックスから始まるループを書くことができます - >配列の最後に1を引いて、各繰り返しで現在の要素の上にある次の要素をコピーする必要があります。最後に、配列のサイズを小さくする必要があります。

注:このようなあなたの関数を呼び出す必要があります。Helper.deleteElement(stringArray, i)

+2

"そして最後にあなたの配列のサイズを小さくしなければなりません。"そして、問題があります。 Javaで配列のサイズを変更することはできません。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html –

+0

私はそれを知らなかった。本当にそれを回避するためのトリックはありませんか? –

0

その後System.arraycopy、かつ有用なArraysクラスを使用します。

static <T> T[] deleteAt(T[] array, int i) { 
    int afteri = array.length - (i + 1); 
    if (afteri > 0) { 
     System.arraycopy(array, i + 1, array, i, afteri); 
    } 
    return array.copyOf(array, array.length - 1); 
} 

ためのint型、ダブル、他のプリミティブ型オーバーロードされた関数が必要とされるであろうことに注意。

関連する問題