#java #arraylist
#java #arraylist
Вопрос:
Я пытаюсь создать метод, который будет выполнять поиск по ArrayList, содержащему несколько слов, в поисках определенной строки. Где, если строка не равна ни одному слову в ArrayList, оно добавит слово в список, и если слово уже существует в списке, оно подсчитает, сколько раз встречается это слово, а затем добавит еще одно, которое будет представлять последний ввод строки. Это то, что у меня есть до сих пор в моем коде:
public void leggTilOrd(String ord) {
if (Ord.contains(ord)) {
teller ;
}
if (!Ord.contains(ord)) {
Ord.add(ord);
}
System.out.println(teller);
}
Очевидно, что это добавит только еще одно число в счетчик (кассир), поэтому я пытаюсь добиться того, чтобы добавить 1 поверх всех вхождений этой конкретной строки в список, и вот тут я застрял.
Редактировать: я должен также упомянуть, что Ord — это ArrayList, который я создал ранее в коде. Вот полный код:
import java.util.Scanner;
import java.io.File;
import java.util.ArrayList;
public class Ordliste {
private ArrayList<String> Ord = new ArrayList<String>();
private int teller = 0;
public void lesBok (String filnavn) throws Exception{
Scanner fil = new Scanner(new File(filnavn));
while(fil.hasNextLine()){
Ord.add(fil.next());
} fil.close();
}
public void leggTilOrd(String ord){
if(Ord.contains(ord)){
teller ;
} if (!Ord.contains(ord)){
Ord.add(ord);
} System.out.println(teller);
}
}
Комментарии:
1. Можете ли вы объяснить, что вы имеете в виду
add 1 on top of all the occurrences of that specific String
? Вы хотите добавить слово в список или просто увеличить счетчик?2. Немного запутался в том, что вы пытаетесь сделать. Не могли бы вы перефразировать / уточнить свой вопрос?
3. Пример списка и результаты для конкретных случаев помогут понять, чего вы хотите достичь. На данный момент я подозреваю, что вы можете просто захотеть удалить second
if
и выполнитьOrd.add(ord);
безоговорочно
Ответ №1:
Вместо этого вы можете отслеживать строки в своем списке, используя Set
Set<String> set = new HashSet<String>();
public void leggTilOrd(String ord) {
if (set.contains(ord) != null) {
teller ;
} else {
Ord.add(ord);
set.add(ord);
}
System.out.println(teller);
}
Комментарии:
1. В чем преимущество использования map, если вы просто сопоставляете ключ самому себе, и единственное, для чего вы его используете, — это проверить, содержит ли map уже ключ? Похоже, вы используете map точно так же, как OP использует их список…
2. время доступа к карте постоянно
3. Тогда, может быть, вы хотите
Set
вместо этого использовать a? Это также имеет постоянное время поиска, с дополнительным преимуществом быть aCollection
(которогоMap
нет).4. Я согласен, но у set возникнут проблемы, если вы хотите отслеживать дубликаты, в map вам нужно только изменить значение на целое число и отслеживать количество вхождений
5. Конечно, но здесь вы используете его не так. Сопоставление значения самому себе — это просто потраченная впустую память и несколько неправильное использование интерфейса map. Как есть, ваша карта не отслеживает дубликаты, поэтому вы пытаетесь использовать ее как набор.
Ответ №2:
Вы привязаны к использованию an ArrayList
? Я бы рекомендовал Map<String, Integer>
вместо этого использовать a и сохранить количество вхождений определенной строки в качестве значения на карте:
if (map.get(ord) != null) {
map.put(ord, map.get(ord) 1);
}
else {
map.put(ord, 1);
}
Ответ №3:
Все еще не уверен, чего именно вы пытаетесь достичь, увеличиваете ли вы teller
каждый раз, когда добавляете другое слово?
Это простой способ сделать то, что, я полагаю, вы пытаетесь, и он должен помочь вам двигаться в правильном направлении.
import java.util.Arrays;
import java.util.List;
public class test
{
static int teller = 0;
static List<String> words = Arrays.asList("dog", "cat", "dog");
public static void main(String[] args)
{
System.out.println(teller);
addAndCount("dog");
System.out.println(teller);
teller = 0;
addAndCount("cat");
System.out.println(teller);
teller = 0;
addAndCount("fish");
System.out.println(teller);
}
public static void addAndCount(String newWord)
{
teller = 1 Math.toIntExact(
words.stream().filter(string -> newWord.equals(string)).count());
words.add(newWord);
}
}