Как я могу найти индекс одного и того же элемента в массиве Java?

int[] array = new int[] {5,7,7,8,8,10}; 
int target = 8;
int first = 0;
for(int i=0;i<array.length;i++) {
if (array[i] == target)     
    return i;     
else     
    return -1; 
}
// Output should be 3,4

Я запускаю цикл от первого до последнего элемента. но он даст индекс 4. Как мы можем получить оба индекса 3 и 4? я попробовал использовать два цикла: один от первого к последнему, а другой от последнего к первому.

Не возвращайтесь и вместо этого поместите каждый i, который вы найдете, в список.

Federico klez Culloca 09.07.2024 15:23

«Выход должен быть 3,4» — технически этот код ничего не выводит. Он возвращает целое число. И, конечно же, «3,4» не является целым числом. Что вы хотите, чтобы этот код возвращал вместо этого? Массив целых чисел? Что-то другое? Какую попытку вы предпринимаете для этого?

David 09.07.2024 15:23

Кстати... "но индекс будет равен 4" - Вы уверены? Если я помещу этот код в метод и вызову этот метод, результат будет -1. Возможно, вы допустили здесь некоторые ошибки или ложные предположения.

David 09.07.2024 15:26

Создайте String[] indexArray такой же длины, как и второй. Поместите туда каждый найденный индекс, а затем объедините их в String

g00se 09.07.2024 15:42
return IntStream.range(0, array.length).filter(i -> array[i] == target).toArray();
k314159 09.07.2024 16:01

Re: «Выходное значение должно быть 3,4», затем замените return i на System.out,println(i) (или аналогичное в зависимости от формата) и удалите else return -1;.

user85421 09.07.2024 16:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно удалить возврат else из for и добавить в список индекс

public static void main(String[] args) {
    System.out.println(getIndices(8));
}

private static  List<Integer>  getIndices(int target) {
    int[] array = new int[] {5, 7, 7, 8, 8, 10}; 
    List<Integer> indices = new ArrayList<>();
    for (int i = 0; i < array.length; i++) {
        if (array[i] == target) {
            indices.add(i);
        }
    }
    return indices;
}

Ваш метод непродуман, поскольку его нельзя применить ни к одному списку. Лучше всего передать список в качестве аргумента и перебирать его. Вы также можете отметить, что использование списков упрощает сохранение и возврат результатов.

WJS 09.07.2024 18:03
Ответ принят как подходящий

Есть много способов. Вот два.

  • Использование потоков (как уже указано в комментариях @k314159).
    • передать индексы массива.
    • фильтровать те, где значение индекса соответствует целевому значению
    • вернуть как массив
public static int[] findIndices(int[] array, int target) {
         return IntStream.range(0,array.length)
              .filter(i->array[i] == target).toArray();
}
  • Простой цикл
    • выделить массив результатов
    • перебрать исходный массив и добавить индекс, когда цель соответствует
    • вернуть подмассив сохраненных значений.
    
public static int[] findIndices(int[] array, int target) {
    int[] results = new int[array.length];
    int pos = 0;
    for (int i = 0; i < array.length; i++) {
        if (array[i] == target) {
            results[pos++] = i;
        }
    }
    return Arrays.copyOfRange(results,0,pos);
}

Другие вопросы по теме