-1

私はこれを正しくするためにいくつかの助けが必要です、

問題 2つの配列を取る関数を記述します。1つの配列はソース配列で、もう1つの配列はインデックスの配列であり、2番目の配列からインデックスを取得してソース配列のインデックスに存在するすべての要素を削除します。

これが私が思いついたものです....

 public static int[] DeleteArrayUsingIndices(int[] source, int[] indices)
    {
        for (int i = 0; i < indices.Length; i++)
        {
            if (indices[i] < source.Length)
            {
                source[indices[i]] = int.MinValue; // delete
            }                
        }

        return source;
    }

これは価値を削除しないので、私はこの解決策についてよくわかりません。誰かがこれで私を助けることができますか?

4

2 に答える 2

2

配列から要素を実際に削除することはできないため、この表現の意味を尋ねる必要があります。int.MinValue要素を(コードのように)例外的な要素に置き換えることが許容される場合、ソリューションは問題ありません。

別の解釈は、「削除されていない」インデックスが元のインデックスと同じ順序で配列の先頭にくるように配列を再配置することです。この場合、配列の新しい「長さ」を返します( 「削除」されなかった要素の数)-これは、「削除」操作により、まだ削除されていない要素の配列が配列の先頭に圧縮されることを意味します(配列の内容が削除されたものから先頭に向かってシフトします)配列の最後(または削除されていない要素の最後)にインデックスを付けます。同じ要素を2回「削除」しないように注意する必要があります。

後者を実現するには、要素の数によってどの位置が移動したかを追跡する必要があります。または、インデックス配列を更新して、現在のインデックスよりも大きいインデックスをデクリメントします(現在圧縮されている配列に対応するため)-この場合、インデックス配列を並べ替えることから始めて(おそらく同時に重複を削除します)、その方法を追跡しますこれまでに多くのポジションがシフトされました

于 2012-06-18T16:53:37.883 に答える
1

これを試して

public static void main(String[] args) {
    Integer[] a = {1,2,3,4,5,6,7,8,9};
    Integer[] b = {2,3};
    System.out.println(Arrays.asList(deleteArrayUsingIndices(a, b)));
}

^テスト用

public static Integer[] deleteArrayUsingIndices(Integer[] source, Integer[] indices)
{
    ArrayList<Integer> sourceArr = new ArrayList<Integer>(Arrays.asList(source));
    ArrayList<Integer> toDelete = new ArrayList<Integer>();
    for (int i:indices)
    {
        try {
            toDelete.add(sourceArr.get(i));
        } catch (Exception e) {}              
    }

    sourceArr.removeAll(toDelete);

    return sourceArr.toArray(new Integer[sourceArr.size()]);
}
于 2012-06-18T16:52:09.040 に答える