Мне нужно добавить в int[] значения, превышающие определенный порог. У меня это не работает, потому что возвращает неправильные значения. Например: «Вывод для значений выше 78: [85, 93, 81, 79, 81, 93]», но я получаю [93, 93, 93, 93, 93, 93]. Почему это так? Спасибо.
public int[] getValuesAboveThreshold(int threshold) {
// Output for values above 78: [85, 93, 81, 79, 81, 93]
int[] a = new int[] { 58, 78, 61, 72, 93, 81, 79, 78, 75, 81, 93 };
int temp[] = new int[1];
for (int d : a) {
if (d > threshold) {
System.out.println(d);
temp = new int[temp.length + 1];
for (int i = 0; i < temp.length; i++) {
temp[i] = d;
}
}
}
return temp;
}
Ну посмотрите, у нас только что был очень похожий вопрос
В вашей логике есть одна важная проблема: вы заменяете свой старый int[] temp
новым массивом (предположительно, чтобы добавить новое значение), но затем перезаписываете каждую запись одним и тем же значением d
. Вероятно, вы хотели вызвать System#arrayCopy
(или использовать этот цикл), чтобы сначала переместить старые данные в новый массив, прежде чем присваивать temp
.
Поскольку вы инициализируете временный массив, по умолчанию для него используется значение по умолчанию int, а когда вы зацикливаете его для добавления значений, он добавляет «d» ко всем индексам. Вместо этого попробуйте ArrayList:
int[] a = new int[] { 58, 78, 61, 72, 93, 81, 79, 78, 75, 81, 93 };
ArrayList<Integer> temp = new ArrayList<Integer>();
for (int d : a) {
if (d > 73) {
System.out.println(d);
temp.add(d);
}
}
System.out.println(temp);
Вы можете вернуть ArrayList вместо int[]. Попробуйте этот пример кода
public static ArrayList<Integer> getValuesAboveThreshold(int threshold) {
// Output for values above 78: [85, 93, 81, 79, 81, 93]
int[] a = new int[] { 58, 78, 61, 72, 93, 81, 79, 78, 75, 81, 93 };
ArrayList<Integer> temp = new ArrayList<>();
for (int d : a) {
if (d > threshold) {
temp.add(d);
}
}
return temp;
}
Массив — это контейнер данных, занимающий непрерывный блок памяти, который выделяется в соответствии с указанным размером массива при создании нового экземпляра массива.
Массивы не могут увеличиваться или уменьшаться, вам всегда нужно указывать длину массива при создании нового массива (если только вы не указываете содержимое массива в фигурных скобках {A,B,C}
, что неявно дает информацию о необходимой емкости).
Чтобы в результате сгенерировать массив, сначала нужно узнать количество элементов, превышающих порог, а затем создать массив, в котором будет храниться результат:
public int[] getValuesAboveThreshold(int[] a, int threshold) {
int count = 0;
for (int i : a) if (i > threshold) count++;
int[] res = new int[count];
int pos = 0; // position in the resulting array
for (int i : a) if (i > threshold) res[pos++] = i; // assign the element and move the position forward
return res;
}
Та же логика может быть реализована с помощью Stream API в одном операторе:
public int[] getValuesAboveThreshold(int[] a, int threshold) {
return Arrays.stream(a)
.filter(i -> i > threshold)
.toArray();
}
Пожалуйста, объясните внутренний цикл
for
.