Как вернуться к номеру индекса

#java #arraylist

#java #arraylist

Вопрос:

Я пытаюсь написать программу, в которой пользователь может написать свой список продуктов, а затем они могут искать, записали ли они этот элемент в список или нет. Когда они обнаруживают, записали ли они имя элемента, предполагается, что он возвращает номер индекса, а если они не записали имя элемента, предполагается, что он возвращает -1. До сих пор мой код может выяснить, записали ли они элемент или нет в логическом выражении.

 import java.util.Scanner;
import java.util.Arrays;

public class GroceryStoreTest {
    // for the search item we need to create a method.

I wrote down a boolean method for the search item.

        public static boolean contains(String [] arr, String targetItem){
            for(String find : arr){
                if(targetItem.equals(find))
                    return true;

            }    return false ;
        }

    public static void main(String[] args) {

//lets create an array of string and add items list

        int list;
        Scanner input = new Scanner(System.in);
        System.out.print("How many items would you like to add to the list: ");
        list = input.nextInt();

        String[] items = new String[list];

        System.out.print("Write down the name of item without any space.n(i.e.; Green Paper = GreenPaper)nnItems list: n");


         int i;
        for (i = 0; i < list; i  ) {
            System.out.printf((i 1 )   ".");
            items[i] = input.next();// asks for next item name

        }

        // search in the items list

        String search = " ";
        System.out.print("Enter the name of the item to check if you have listed: "   search);
        search = input.next();
        //System.out.print(contains(items, String.valueOf(input)));
        System.out.print(contains(items, search));
        input.close();// it will stop taking the input
    }
}
  

Комментарии:

1. По сути, вам просто нужно заменить цикл for-each на contains() цикл, который увеличивает счетчик, например, тот, который вы используете main() .

2. После того, как я удалю некоторые элементы из списка, я хочу снова распечатать элементы. Что мне делать? Должен ли я ввести новую строку и распечатать ее?

3. Если я правильно понял, вы должны просто перебирать массив и печатать каждый элемент таким образом.

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

5. Возможно, вам следует задать другой вопрос, включив соответствующий код.

Ответ №1:

Другие ответы верны, но есть и другая точка зрения: вы должны понимать разницу между циклами «для каждого» и «для подсчета».

Вы получили:

 public static boolean contains(String [] arr, String targetItem){
  for(String find : arr){
      if(targetItem.equals(find))
        return true;
      }
   return false ;
}
  

Что уже довольно хорошо. (Возможно, ожидайте тонкой вещи, которую я бы посоветовал вам всегда помещать блоки в {фигурные скобки}; поскольку слишком легко ошибиться, чтобы сэкономить этот небольшой ввод. )

Но в целом этот код в порядке. На самом деле следует предпочесть этот стиль зацикливания. Потому что эта конструкция действительно улучшает читаемость, заставляя вас «меньше читать».

Но в вашем случае: вам нужен этот индекс. Таким образом, цикл for-each не дает вам того, что вам нужно. Таким образом, это тот случай, когда цикл счетчика старой школы лучше:

 for (int i=0; i<arr.length;i  ) {
... and now i is the index you are looking for; thus the value to return

or -1 in the end if nothing matched
  

Ответ №2:

Почему бы просто не изменить свой contains метод, чтобы вернуть int вместо этого?

 public static int indexOf(String [] arr, String targetItem){
    for(int i = 0 ; i < arr.length ; i  ) {
        if(targetItem.equals(arr[i]))
            return i;

    }
    return -1 ;
}
  

Кроме того, вам не нужно создавать свой собственный indexOf метод, вы можете просто вызвать Arrays.asList(items).indexOf("valueSearch") , чтобы получить индекс.

Другой способ сделать это — использовать список массивов вместо массива. An ArrayList — это в основном массив без фиксированной длины. Ваш код будет выглядеть следующим образом:

 Scanner input = new Scanner(System.in);

ArrayList<String> items = new ArrayList<>();

System.out.print("Write down the name of item without any space.n(i.e.; Green Paper = GreenPaper)nnWrite "END" to finish entering itemsnnItems list: n");


while(true) {
    String item = input.next();
    if (item.equals("END")) {
        break;
    }
    items.add(item);
}

// search in the items list

String search = " ";
System.out.print("Enter the name of the item to check if you have listed: "   search);
search = input.next();
System.out.print(items.indexOf(search));
input.close();// it will stop taking the input
  

Вот пример того, как удалить все вхождения чего-либо из списка массивов:

 ArrayList<String> a = new ArrayList<>();
a.add("Hello");
a.add("Hello");
while (a.contains("Hello")) {
    a.remove("Hello");
}
  

Комментарии:

1. один вопрос, что делать, если я хочу удалить элемент из списка. Допустим, я написал apple 2 раза, и когда я удаляю apple; тогда все вхождения должны быть удалены.

2. Как правило, вы должны объявлять с помощью интерфейса и создавать экземпляр с конкретной реализацией , поэтому List<String> a = new ArrayList<>(); (объявление списка , а не ArrayList )

Ответ №3:

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

 for(int i = 0 ; i < items.length ; i  ) {
    if(targetItem.toLowerCase().equals(items[i].toLowerCase()))
        System.out.println("Index "   i);
}    
  

или с помощью класса ArrayList можно выполнить следующим образом

  System.out.println(Arrays.asList(items).indexOf("valueSearch"));