これが私がこれまでに持っているもので、いくつかのテストケースで機能します。このメソッドは、一部の配列ではうまく機能しますが、他の配列ではうまく機能しません。問題がどこにあるのか、私は迷っています。メソッドの説明は、上記のメソッドのコメントにあります。
/**
* Return an array of all the elements of a that are greater than val.
* If a contains no elements greater than val, this method returns an
* array of zero length.
*
* @param a the array to be searched
* @param val the reference value
* @return the elements a[i] such that a[i] > val
*
*/
public static int[] greater(int[] a, int val) {
if (a == null || a.length == 0) {
throw new IllegalArgumentException();
}
int x = 0;
int[] copy = Arrays.copyOf(a, a.length);
Arrays.sort(copy);
int nearest = copy[0];
for (int i = 0; i < copy.length; i++) {
if (Math.abs(nearest - val) > Math.abs(copy[i] - val)) {
nearest = copy[i];
x = i;
}
}
if ((x + 1) >= copy.length) {
int[] badAnswer = new int[0];
return badAnswer;
}
else {
int[] answer = new int[(copy.length - 1) - x];
int index = 0;
while (index < answer.length) {
answer[index] = copy[x + (index + 1)];
index++;
}
return answer;
}
}
これは、JUnit を使用したこのテストで機能します。
int a[] = {17,14,3,10,5,1,25};
@Test public void greaterTest() {
int d[] = Selector.greater(a, 5);
int p[] = {10, 14, 17, 25};
Assert.assertArrayEquals(d, p);
}
しかし、これではありません:
int z[] = {-5,-2,0,4,8,15,50};
@Test public void greaterTest2() {
int d[] = Selector.greater(z, -99);
int p[] = {-5,-2,0,4,8,15,50};
Assert.assertArrayEquals(d, p);
また、すべてが val 未満の整数を繰り返す場合も同様です。
int z[] = {0, 0, 0, 0, 0};
@Test public void greaterTest2() {
int d[] = Selector.greater(z, 51);
int p[] = {};
Assert.assertArrayEquals(d, p);
}
私の方法でこれらのギャップを修正する方法についてのアイデアはありますか?