配列のソートと削除
String型のstrToRemoveで与えられた文字列を配列から探し、あればそれ以降の配列の数字をすべて左にシフトします。
なので配列の大きさは1小さくなります。その結果の配列をreturnで返します。
例)
({"A","B","C","D","B"}, "B")配列1にBがあるのでそれ以降の文字列をすべて左にシフト→ {"A","C","D","B"}
({"A","B","C","D","B"}, "A") 配列0にAがあるのでそれ以降の文字列を左にシフト→ {"B","C","D","B"}
プログラムは以下のように組みました。
public class ArrayFun {
public String[] oneRemoved(String[] array, String strToRemove) {
int count = 0;
for (int i = 0; i < array.length; i++) {
if (strToRemove.equals(array[i]) && count == 0) {
for (int j = i; j < array.length - 1; j++) {
array[j] = array[j + 1];
}
count++;
}
}
array = new String[array.length - 1];
array[array.length - 1] = null;
return array;
}
}
ちなみにcountは、一度シフトすればもう同じ文字列がそれ以降の配列にあってもシフトはしないので、countでシフトしたかどうかを判断しようと思い付けました。
これでテストメソッドも作るのですが、
import static org.junit.Assert.*;
import org.junit.Test;
public class ArrayFunTest {
@Test
public void testoneRemoved() {
ArrayFun af = new ArrayFun();
String[] a1 = {"A","B","C","D","B" };//元の配列
String[] a2 = {"A","BB","CCC","DDD","B"};//元の配列
String[] a3 = {"B","C","D","B"};//シフト後の配列
String[] a4 = {"A","BB","CCC","DDD","B"};//シフト後の配列
assertEquals(a3, af.oneRemoved(a1, "A"));
assertEquals(a4, af.oneRemoved(a2, "NotHere"));
}
}
以上のように組むと、assertEqualsの真ん中に黒線が入って自動的に@SuppressWarnings("deprecation")が加えられてしまいます。
実行結果は、({"A","B","C","D","B"}, "A") の例だと、配列0にB が入るはずがnullになっている、とエラーがでます。
どのようにしたら正常に動かせるでしょうか?宜しくお願いします。
お礼
まさしくこれと同じ関数がほしかったのです! ありがとうございます!!