Проверка, равно ли слово определенному слову в ArrayList

#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? Это также имеет постоянное время поиска, с дополнительным преимуществом быть a Collection (которого 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);
  }
}