#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"));