2016-03-13 3 views
0

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

public int count(String a, String[] b) { 

} 

E.g.

count(" hey are you there ", new String[]{ "are", "i", "am"}) 

вернет 3, поскольку в строке есть слово «есть».

Во-первых, я думаю, что мне нужно использовать функцию string.split для преобразования строки в массив строк. Есть идеи?

+1

Почему '3'? '" - это '' только в 'String' один раз. Что, если в массиве тоже было «эй»? –

+0

"* количество слов в строке, которая не имеет вхождений слов в массив строк *" - Это сбивает с толку. – Maroun

+0

Итак, в строке есть 4 слова, но поскольку есть слово «есть», которое находится в массиве строк, которое появляется в строке, оно должно вычитать количество чисел на 1, следовательно, должно возвращаться 3. –

ответ

0

Чтобы выполнить задачу, выполните следующие действия.

  • Использование StringTokenizer для разбития на строку a.
  • Преобразование String Array b в Collection, так что вы можете проверить, содержит ли он данный токен.
  • Используйте петлю для получения следующего token от StringTokenizer и проверьте, содержит ли она в List.

-

Try ниже код, он будет работать.

EDIT: Использование java.util package.

public int count(String a, String[] b) { 
    java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(a); 
    java.util.List bList = java.util.Arrays.asList(b); 
    int tokens = tokenizer.countTokens(); 
    int counter = tokens; 
    for(int i=0;i<tokens;i++) { 
     String token = tokenizer.nextToken().trim(); 
     if(bList.contains(token)) { 
      counter--; 
     } 
    } 
    return counter; 
} 

С помощью этого, вы можете получить счетчик в одном только для цикла.

EDIT :: Использование java.lang упаковка только.

public int count(String a, String[] b) { 
    String[] words = a.split(" "); 
    int tokens = words.length; 
    int wordCount = 0; 
    int counter = 0; 
    for(int i=0;i<tokens;i++) { 
     String token = words[i].trim(); 
     if(token.length() <= 0) { 
      continue; 
     } 
     wordCount++; 
     for(String bItem : b) { 
      if(bItem.equals(token)) { 
       counter++; 
       break; 
      } 
     } 
    } 
    return wordCount - counter; 
} 
+0

Этот метод работает, и я рассмотрю StringTokenizer и List. Но является ли java.util.StringTokenizer, List, Arrays под java.lang? Потому что я хочу реализовать эту логику только с помощью чего-либо в java.lang. Спасибо за вашу помощь. –

+0

Нет, они находятся под пакетом 'java.util'. Если вы хотите использовать только пакет' java.lang', вам нужно изменить логику. – ELITE

+0

О, это несчастливо. Я хочу реализовать это только с помощью пакета java.lang. Но ваш метод работает очень хорошо! –

1

Вы могли бы просто сделать что-то вроде:

public int count(String a, String[] b) { 
    int count = b.length; 
    for(String s : b) if(a.contains(s)) count--; 
    return count; 
} 

EDIT: я мог бы спутать, я думал, что ты хотел # строк в b не в a (в вашем примере это все равно будет 3). В этом случае из вашего примера, split кажется неудобным, если вы не используете regex, чтобы вы могли создать String[] с помощью Scanner:

public int count(String a, String[] b) { 
    ArrayList<String> words = new ArrayList<String>(); 
    Scanner scan = new Scanner(a); 
    while(scan.hasNext()) words.add(scan.next()); 

    int count = words.size(); 
    for(String s : words) if(/*b contains s*/) count--; 
    return count; 
} 
+2

Вы действительно не должны лопнуть. Этот ответ даже не объясняет, почему он работает. Хотя это верно, искатель может почувствовать, что все в порядке, чтобы создать «запрос кода». –

+1

Плохая идея. 'a' может содержать несколько экземпляров' s'. 'a' может содержать слова, которые' '' являются подстрокой. –

+0

Он хотел, чтобы количество слов не было в b. –

0

Вы логика должна идти примерно так:

  1. Split a, правильно. Теперь у вас есть список слов. В реальной жизни вы, вероятно, должны также попытаться прояснить требование - что такое «слово»? Разумное предположение состоит в том, что это последовательность символов без пробелов, но может быть чем-то другим (например, последовательность букв).

  2. Итератеть над a и проверить, есть ли каждое слово в b. Если это не так, увеличьте свой счетчик. Но каждый чек линейный поиск в b, что приводит к общей сложности O (нм), так что ...

  3. Перед перебора, конвертировать b в HashSet. Это линейная операция, но тогда ваш основной цикл также станет линейной операцией, поэтому общая сложность будет равна O (m + n).

  4. Если вам нужно сделать это много раз для разных строк, но в том же списке слов, подумайте о создании класса WordCounter, поэтому вам нужно только создать HashSet один раз в конструкторе.

+0

Спасибо за ваш ответ, но я бы хотел получить решение без использования HashSet и ArrayList или что-то в этом роде. Поэтому без импорта ничего, если это имеет смысл. –

+0

@ J.Young, нет, это не имеет никакого смысла. Однако вам придется остановиться на (2) в этом случае. Таким образом, у вас будет O (нм).Если список слов был отсортирован, вы можете уменьшить его до O (n log m), используя двоичный поиск, но он даже не сортируется в вашем примере. –

+0

@ J.Young, не говоря уже о том, что вам уже нужно импортировать 'String', хотя это неявно, но это все еще импорт. –

Смежные вопросы