Java - Как вытащить позицию списка как целое число? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь заставить мой код получить все значения моего индекса, которые совпадают. В настоящее время я не знаю, как вытащить позиционное значение из списка (например, если оно находится в позиции 0, 1, 2, 3 и т. Д. c), основываясь на том, содержит ли оно соответствующее введенное значение.

import java.util.ArrayList;
import java.util.Scanner;

public class Test086 {
    public static void main(String[] args) {

        Scanner user = new Scanner(System.in);
        ArrayList<Integer> array = new ArrayList<>();


        int userIn = 0;
        System.out.println("Please provide your own array of numbers. Hit enter again to exit the program.");

        while (true) {
            userIn = Integer.valueOf(user.nextLine());
            if (userIn == -1) {
                break;
            }
            else {
                array.add(userIn);
            }
        }

        System.out.print("Search for? ");
        int index = Integer.valueOf(user.nextLine());
        int indSize = array.size() - 1;

        for (int i = 0; i < array.size(); i++) {
            if (index == array.get(i)) {
                System.out.print(index + " is at index ");
            }
             System.out.println(indSize);
        }
    }
}

Если я набрал в своей программе список:

72
2
8
8
11
-1

Search for? 8

Я ожидаю получить это в качестве вывода:

8 is at index 2
8 is at index 3

Что это что я не знаю? Есть ли какой-нибудь способ проверить положение и вытащить его, как для l oop, который у меня есть?

Ответы [ 3 ]

1 голос
/ 08 марта 2020
    for (int i = 0; i < array.size(); i++) {
        if (index == array.get(i)) {
            System.out.print(index + " is at index " + i); // change here
        }
         System.out.println(indSize);
    }
0 голосов
/ 08 марта 2020

Вам необходимо напечатать значение i в вашем for l oop следующим образом:

for (int i = 0; i < array.size(); i++) {
    if (index == array.get(i)) {
        System.out.println(index + " is at index " + i);
    }
}

В дополнение к этому, я также рекомендую вам использовать дженерики, например List<Integer> array = new ArrayList<Integer>() ArrayList<Integer> array = new ArrayList<>(). Отметьте this , чтобы узнать больше об этом.

Другая рекомендация - выполнять обработку исключений для случаев, когда пользователь вводит недопустимое значение.

Завершить программу:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test086 {
    public static void main(String[] args) {

        Scanner user = new Scanner(System.in);
        List<Integer> array = new ArrayList<Integer>();

        int userIn = 0;
        System.out.println("Please provide your own array of numbers. Hit enter again to exit the program.");

        while (true) {
            try {
                userIn = Integer.parseInt(user.nextLine());
                if (userIn == -1) {
                    break;
                } else {
                    array.add(userIn);
                }
            } catch (Exception e) {
                System.out.println("Invalid input. Try again.");
            }
        }

        int index = 0;
        boolean valid;
        do {
            valid = true;
            System.out.print("Search for? ");
            try {    
                index = Integer.valueOf(user.nextLine());
            } catch (Exception e) {
                System.out.println("Invalid input. Try again.");
                valid = false;
            }
        } while (!valid);
        for (int i = 0; i < array.size(); i++) {
            if (index == array.get(i)) {
                System.out.println(index + " is at index " + i);
            }
        }
    }
}

Пример прогона:

Please provide your own array of numbers. Hit enter again to exit the program.
72
2
a
Invalid input. Try again.
abc
Invalid input. Try again.
8
8
11
-1
Search for? a
Invalid input. Try again.
Search for? x
Invalid input. Try again.
Search for? 8
8 is at index 2
8 is at index 3

Чтобы сделать программу модульной, я также рекомендую разделить вводимые пользователем данные в отдельный метод (например, int getIntInput(Scanner)) следующим образом:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test086 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        List<Integer> list = new ArrayList<Integer>();

        int userIn = 0;
        System.out.println("Please provide your own array of numbers. Hit enter again to exit the program.");
        while (true) {
            userIn = getIntInput(in);
            if (userIn == -1) {
                break;
            } else {
                list.add(userIn);
            }
        }

        System.out.print("Search for? ");
        int index = getIntInput(in);
        for (int i = 0; i < list.size(); i++) {
            if (index == list.get(i)) {
                System.out.println(index + " is at index " + i);
            }
        }
    }

    static int getIntInput(Scanner in) {
        boolean valid;
        int n = 0;
        do {
            valid = true;
            try {
                n = Integer.valueOf(in.nextLine());
            } catch (Exception e) {
                System.out.println("Invalid input. Try again.");
                valid = false;
            }
        } while (!valid);
        return n;
    }
}

Пробный прогон:

Please provide your own array of numbers. Hit enter again to exit the program.
72
2
a
Invalid input. Try again.
abc
Invalid input. Try again.
8
8
11
-1
Search for? x
Invalid input. Try again.
8
8 is at index 2
8 is at index 3
0 голосов
/ 08 марта 2020

В списке есть метод для этого. Это позволяет вам получить индекс для объекта. Возвращает индекс первого найденного значения, которое совпадает. Есть два способа приблизиться к этому, используя эту функцию. Оба используют sublist функцию списка.

Первый метод получает метод lastIndexOf для получения индекса. Преимущество этого заключается в том, что при создании подсписка он не меняет нормальную позицию следующего элемента. Недостатком является то, что индексы получаются в обратном порядке.

        List<Integer> vals =
                new ArrayList<>(List.of(10, 20, 1, 9, 10, 55, 9, 9, 9));

        int selection = 9;
        for (;;) {
            int idx = vals.lastIndexOf(selection);
            if (idx < 0) {
                break;
            }
            System.out.println(selection + " located at index " + idx);
            vals = vals.subList(0, idx);
        }

Этот следующий метод использует indexOf для получения значения. Чтобы убедиться, что индексы правильные, в некоторых бухгалтериях необходимо разрешить укороченные подсписки.

        vals = new ArrayList<>(List.of(10, 20, 1, 9, 10, 55, 9, 9, 9));
        int lastIndex = 0;
        for (;;) {
            int idx = vals.indexOf(selection);
            if (idx < 0) {
                break;
            }
            System.out.println(selection + " located at index "
                    + (idx + lastIndex));
            idx++;
            lastIndex += idx;
            vals = vals.subList(idx, vals.size());
        }

Наконец, снова используя indexOf, если все в порядке, чтобы изменить предоставленный список, все, что нужно сделать заменить текущее значение на другое, чтобы оно больше не было найдено.

        vals = new ArrayList<>(List.of(10, 20, 1, 9, 10, 55, 9, 9, 9));

        for (;;) {
            int idx = vals.indexOf(selection);
            if (idx < 0) {
                break;
            }
            System.out.println(selection + " located at index "
                    + idx);
            vals.set(idx, selection + 1); // modify selection
        }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...