программа для определения количества дубликатов в предложении - PullRequest
4 голосов
/ 17 июня 2010

Код: дубликат общественного класса

{

public static void main(String[] args)throws IOException

  {

  System.out.println("Enter words separated by spaces ('.' to quit):");

  Set<String> s = new HashSet<String>();

  Scanner input = new Scanner(System.in);

  while (true)

  {

  String token = input.next();

  if (".".equals(token))

  break;

  if (!s.add(token))

  System.out.println("Duplicate detected: " + token);

  }

  System.out.println(s.size() + " distinct words:\n" + s);
 Set<String> duplicatesnum = new HashSet<String>();

String token = input.next (); if (! s.add (токен)) { duplicatesnum.add (маркер); System.out.println ("Обнаружен дубликат:" + токен) }

System.out.println (duplicatesnum.size ()); * +1008 *

} } выход: Введите слова, разделенные пробелами («.» Для выхода): один два один два. Обнаружен дубликат: один Обнаружено дублирование: два 2 разных слова: [два, один]

Ответы [ 6 ]

2 голосов
/ 17 июня 2010

Полагаю, вы хотите узнать количество разных повторяющихся слов. Вы можете использовать другой HashSet<String> для дубликатов.

//Outside the loop
Set<String> duplicates = new HashSet<String>();

//Inside the loop
if (!s.add(token))
{
    duplicates.add(token);
    System.out.println("Duplicate detected: " + token);
}

//Outside the loop
System.out.println(duplicates.size());

Также, если вы заботитесь о вхождениях каждого слова, объявите HashMap<String, Integer>, как указано в других сообщениях.

Но если вы хотите, чтобы количество всех повторяющихся слов (не отличающихся) просто объявите счетчик:

//Outside the loop
int duplicates = 0;    

//Inside the loop
if (!s.add(token))
{
    duplicates++;
    System.out.println("Duplicate detected: " + token);
}

//Outside the loop
System.out.println(duplicates);
2 голосов
/ 17 июня 2010

Вместо HashSet используйте HashMap. HashSet хранит только значения. HashMap отображает значение на другое значение (см. http://www.geekinterview.com/question_details/47545 для объяснения)

В вашем случае ключом HashMap является ваша строка (так же, как ключом HashSet является строка). Значение в HashMap - это количество раз, когда вы встречали эту строку.

Когда вы найдете новую строку, добавьте ее в HashMap и установите значение записи равным нулю. Когда вы встретите ту же строку позже, увеличьте значение в HashMap.

1 голос
/ 17 июня 2010

Поскольку вы используете HashSet, вы не будете знать, сколько у вас дубликатов.Если вы пошли с HashMap<String, Integer>, вы можете увеличивать всякий раз, когда обнаружите, что ваш ключ был != null.

0 голосов
/ 17 июня 2010

Вы можете использовать Библиотека коллекций Google :

Multiset<String> words = HashMultiset.create();

while (true) {
    String token = input.next();

    if (".".equals(token))
        break;
    if (!words.add(token))
        System.out.println("Duplicate detected: " + token);
}
System.out.println(words.elementSet().size() + " distinct words:\n" + words.elementSet());

Collection<Entry<String>> duplicateWords = Collections2.filter(words.entrySet(), new Predicate<Entry<String>>() {
   public boolean apply(Entry<String> entry) {
      return entry.getCount() > 1;
   }
});
System.out.println("There are " + duplicateWords.size() + " duplicate words.");
System.out.println("The duplicate words are: " + Joiner.on(", ").join(duplicateWords));

Пример вывода:

Enter words separated by spaces ('.' to quit):
aaa bbb aaa ccc aaa bbb .
3 distinct words:
[aaa, ccc, bbb]
There are 2 duplicate words.
The duplicate words are: aaa x 3, bbb x 2
0 голосов
/ 17 июня 2010

Ваш вопрос немного вводит в заблуждение.Некоторые люди понимают, что вы хотите:

Ввод: привет мужчина, привет женщина, попрощайтесь со своим мужчиной.

Вывод:

Найден дубликат: Здравствуйте

Найден дубликат: Человек

Количество дубликатов: 2

Другие поняли, что вы хотели:

Ввод: привет мужчина, привет женщина, поздороваться с вашим мужчиной.

Вывод:

Найдено дубликатов: Hello - 3Появления

Найдены дубликаты: Человек - 2 появления

Предполагая, что вам нужен 1-й вариант - используйте решение Петар Минчев

ПредполагаяВам нужен второй вариант - используйте решение Patrick .Не забывайте, что когда вы используете Integer на карте, вы также можете получить / положить int, и Java автоматически сделает это для вас / распакует, но если вы положитесь на это - вы можете получить NPE при запросекарта для ключа, который не существует:

Map<String,Integer> myMap = new HashMap<String,Integer>();    
myMap.get("key that does not exist"); // NPE here <---

NPE вызывается, так как возвращаемое значение из 'get' является нулевым, и это значение преобразуется в Integer, после чего intValue()метод будет вызван - таким образом вызывая NPE.

0 голосов
/ 17 июня 2010

В if (!s.add(token)) вы можете увеличить счетчик и затем отобразить его значение в конце.

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