This should be quite simple (I think), but I just can’t get it right…:|
The task is as follows:
Ask the user for some input. The input must be split in to single words and put into an array. All words should be counted. If equal words exists, they get a «+1» on the output.
Finally I want to print out and hopefully the right amount of counted words in a list. I got the first two columns right, but the word-counter of equal words gave me a headache. If a word is found to be equal, it mustnt appear twice in the generated list! :!
I am a complete JAVA newbie so please be kind on the code-judging.
Here is my code so far:
package MyProjects;
import javax.swing.JOptionPane;
public class MyWordCount {
public static void main(String[] args) {
//User input dialog
String inPut = JOptionPane.showInputDialog("Write som text here");
//Puts it into an array, and split it with " ".
String[] wordList = inPut.split(" ");
//Print to screen
System.out.println("Place:tWord:tCount: ");
//Check & init wordCount
int wordCount = 0;
for (int i = 0; i < wordList.length; i++) {
for (int j = 0; j < wordList.length; j++){
//some code here to compare
//something.compareTo(wordList) ?
}
System.out.println(i + "t" + wordList[i]+ "t" + wordCount[?] );
}
}
}
Chimera
5,8587 gold badges49 silver badges80 bronze badges
asked Sep 11, 2012 at 20:56
5
You can use Hashmap to do that. A Hashmap stores key-value pairs and each key has to be unique.
So in your case, a key will be a word of the string you have split and value will be it’s count.
Once you have split the input into words and put them into a string array, put the first word,as a key, into the Hashmap and 1 as it’s value. For each subsequent word, you can use the function containsKey() to match that word with any of the existing keys in the Hashmap. If it returns true, increment the value (count) of that key by one, else put the word and 1 as a new key-value pair into the Hashmap.
answered Sep 11, 2012 at 21:12
QuasarQuasar
932 silver badges4 bronze badges
So in order to compare two strings, you do:
String stringOne = "Hello";
String stringTwo = "World";
stringOne.compareTo(stringTwo);
//Or you can do
stringTwo.compareTo(stringOne);
You can’t compare a String to a String array like in your comment. You would have to take an element in this string array, and compare that (So stringArray[elementNumber]).
For counting how many words there are, if you are determining the number of repeated words, you would want to have an array of integers (So make a new int[]). Each place in the new int[] should correspond to the word in your array of words. This would allow you to count the number of times a word is repeated.
answered Sep 11, 2012 at 21:07
ClarkClark
1,3591 gold badge7 silver badges18 bronze badges
import java.util.ArrayList;
import java.util.regex.PatternSyntaxException;
import javax.swing.JOptionPane;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
//Print to screen
System.out.println("Place:tWord:tCount: ");
//User input dialog
String inPut = JOptionPane.showInputDialog("Write som text here");
//Puts it into an array, and split it with " ".
String[] wordList;
try{
wordList = inPut.split(" ");
}catch(PatternSyntaxException e) {
// catch the buggy!
System.out.println("Ooops.. "+e.getMessage());
return;
}catch(NullPointerException n) {
System.out.println("cancelled! exitting..");
return;
}
ArrayList<String> allWords = new ArrayList<String>();
for(String word : wordList) {
allWords.add(word);
}
// reset unique words counter
int uniqueWordCount = 0;
// Remove all of the words
while(allWords.size() > 0) {
// reset the word counter
int count = 0;
// get the next word
String activeWord = allWords.get(0);
// Remove all instances of this word
while(doesContainThisWord(allWords, activeWord)) {
allWords.remove(activeWord);
count++;
}
// increase the unique word count;
uniqueWordCount++;
// print result.
System.out.println(uniqueWordCount + "t" + activeWord + "t" + count );
}
}
/**
* This function returns true if the parameters are not null and the array contains an equal string to newWord.
*/
public static boolean doesContainThisWord(ArrayList<String> wordList, String newWord) {
// Just checking...
if (wordList == null || newWord == null) {
return false;
}
// Loop through the list of words
for (String oldWord : wordList) {
if (oldWord.equals(newWord)) {
// gotcha!
return true;
}
}
return false;
}
}
answered Sep 11, 2012 at 21:31
drzymaladrzymala
1,99119 silver badges25 bronze badges
Here’s a solution using a map of WordInfo objects that records locations of the words within the text and uses that as a count. The LinkedHashMap preserves the order of keys from when they are first entered so simply iterating through the keys gives you the «cast in order of appearance»
You can make this case insensitive while preserving the case of the first appearance by storing all keys as lower case but storing the original case in the WordInfo object. Or just convert all words to lower case and leave it at that.
You may also want to think about removing all ,
/ .
/ "
etc from the first text before splitting, but you’ll never get that perfect anyway.
import java.util.LinkedHashMap;
import java.util.Map;
import javax.swing.JOptionPane;
public class MyWordCount {
public static void main(String[] args) {
//User input dialog
String inPut = JOptionPane.showInputDialog("Write som text here");
Map<String,WordInfo> wordMap = new LinkedHashMap<String,WordInfo>();
//Puts it into an array, and split it with " ".
String[] wordList = inPut.split(" ");
for (int i = 0; i < wordList.length; i++) {
String word = wordList[i];
WordInfo wi = wordMap.get(word);
if (wi == null) {
wi = new WordInfo();
}
wi.addPlace(i+1);
wordMap.put(word,wi);
}
//Print to screen
System.out.println("Place:tWord:tCount: ");
for (String word : wordMap.keySet()) {
WordInfo wi = wordMap.get(word);
System.out.println(wi.places() + "t" + word + "t" + wi.count());
}
}
}
And the WordInfo class:
import java.util.ArrayList;
import java.util.List;
public class WordInfo {
private List<Integer> places;
public WordInfo() {
this.places = new ArrayList<>();
}
public void addPlace(int place) {
this.places.add(place);
}
public int count() {
return this.places.size();
}
public String places() {
if (places.size() == 0)
return "";
String result = "";
for (Integer place : this.places) {
result += ", " + place;
}
result = result.substring(2, result.length());
return result;
}
}
answered Sep 11, 2012 at 22:57
Link19Link19
5841 gold badge18 silver badges47 bronze badges
Thanks for trying to help me. -This is what I ended up doing:
import java.util.ArrayList;
import javax.swing.JOptionPane;
public class MyWordCount {
public static void main(String[] args) {
// Text in
String inText = JOptionPane.showInputDialog("Write some text here");
// Puts it into an array, and splits
String[] wordlist = inText.split(" ");
// Text out (Header)
System.out.println("Place:tWord:tNo. of Words: ");
// declare Arraylist for words
ArrayList<String> wordEncounter = new ArrayList<String>();
ArrayList<Integer> numberEncounter = new ArrayList<Integer>();
// Checks number of encounters of words
for (int i = 0; i < wordlist.length; i++) {
String word = wordlist[i];
// Make everything lowercase just for ease...
word = word.toLowerCase();
if (wordEncounter.contains(word)) {
// Checks word encounter - return index of word
int position = wordEncounter.indexOf(word);
Integer number = numberEncounter.get(position);
int number_int = number.intValue();
number_int++;
number = new Integer(number_int);
numberEncounter.set(position, number);
// Number of encounters - add 1;
} else {
wordEncounter.add(word);
numberEncounter.add(new Integer(1));
}
}
// Text out (the list of words)
for (int i = 0; i < wordEncounter.size(); i++) {
System.out.println(i + "t" + wordEncounter.get(i) + "t"
+ numberEncounter.get(i));
}
}
}
answered Sep 21, 2012 at 23:11
CustomCaseCustomCase
2471 gold badge4 silver badges15 bronze badges
Один из способов решения этой задачи — использовать словарь. Можно создать словарь, в котором каждому элементу списка соответствует количество его повторений, и в цикле перебрать элементы списка, добавляя их в словарь.
Вот пример такой функции:
def count_repeats(lst):
"""
Возвращает словарь, в котором каждому элементу списка lst соответствует
количество его повторений.
"""
repeats = {}
for item in lst:
if item in repeats:
repeats[item] += 1
else:
repeats[item] = 1
return repeats
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
repeats = count_repeats(lst)
print(repeats) # {10: 3, 123: 2}
Функция count_repeats
принимает на вход список lst
, перебирает его элементы и добавляет их в словарь repeats
. Если элемент уже есть в словаре, то увеличивается значение соответствующей пары ключ-значение, если же элемента еще нет в словаре, то добавляется пара с ключом равным этому элементу и значением 1
.
Вы можете использовать эту функцию, чтобы найти повторяющиеся элементы в списке и количество их повторений.
Вы также можете использовать функцию Counter из модуля collections, чтобы посчитать количество повторений элементов списка. Эта функция возвращает словарь, в котором каждому элементу списка соответствует количество его повторений.
Вот пример кода, который использует функцию Counter:
from collections import Counter
def count_repeats(lst):
"""
Возвращает словарь, в котором каждому элементу списка lst соответствует
количество его повторений.
"""
return Counter(lst)
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
repeats = count_repeats(lst)
print(repeats) # Counter({10: 3, 123: 2})
В этом коде сначала импортируется модуль collections
и функция Counter
, а затем определяется функция count_repeats
, которая принимает список lst
и возвращает результат вызова функции Counter
на этом списке.
Вы также можете использовать функцию most_common
из модуля collections
, чтобы найти топ-N самых часто встречающихся элементов в списке. Эта функция принимает список и число N, и возвращает список кортежей, каждый из которых содержит элемент и количество его повторений.
Вот пример кода, который использует функцию most_common
:
from collections import Counter
def find_top_repeats(lst, n):
"""
Возвращает топ-N самых часто встречающихся элементов в списке lst.
"""
return Counter(lst).most_common(n)
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
top_repeats = find_top_repeats(lst, 2)
print(top_repeats) # [(10, 3), (123, 2)]
В этом коде сначала импортируется модуль collections
и функция Counter
, а затем определяется функция find_top_repeats
, которая принимает список lst
и число n
, и возвращает результат вызова функции most_common
Если вам нужно найти только уникальные элементы в списке, то можете использовать функцию set. Эта функция создает множество из элементов списка, удаляя повторяющиеся элементы. Множество не содержит повторяющихся элементов, поэтому вы можете использовать его, чтобы найти уникальные элементы в списке.
Вот пример кода, который использует функцию set
:
def find_unique(lst):
"""
Возвращает список уникальных элементов в списке lst.
"""
return list(set(lst))
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
unique = find_unique(lst)
print(unique) # [66, 78, 10, 123, 23]
В этом коде определяется функция find_unique
, которая принимает список lst
и возвращает список уникальных элементов. Для этого список преобразуется в множество
Если вам нужно найти только уникальные элементы в списке и посчитать их количество, то можете соединить два предыдущих подхода: сначала использовать функцию set
для нахождения уникальных элементов, а затем функцию count_repeats
для подсчета их количества.
Вот пример кода, который реализует этот подход:
def count_unique(lst):
"""
Возвращает словарь, в котором каждому уникальному элементу списка lst соответствует
количество его повторений.
"""
repeats = {}
for item in set(lst):
repeats[item] = lst.count(item)
return repeats
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
unique_counts = count_unique(lst)
print(unique_counts) # {66: 1, 78: 1, 10: 3, 123: 2}
В этом коде определяется функция count_unique
, которая принимает список lst
и возвращает словарь, в котором каждому уникальному элементу списка
В этом посте мы обсудим, как найти повторяющиеся элементы в списке в Python.
1. Использование index()
функция
Простое решение состоит в том, чтобы выполнить итерацию по списку с индексами, используя понимание списка, и проверить наличие другого вхождения каждого встреченного элемента, используя index()
функция. Временная сложность этого решения будет квадратичной, а код не обрабатывает повторяющиеся элементы в выводе.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = [x for i, x in enumerate(nums) if i != nums.index(x)] print(dup) # [1, 5, 1] |
Скачать Выполнить код
2. Использование оператора In
Кроме того, вы можете использовать нарезку с in
оператор для поиска в уже посещенной части списка. Временная сложность решения остается квадратичной и позволяет повторять элементы на выходе.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = [x for i, x in enumerate(nums) if x in nums[:i]] print(dup) # [1, 5, 1] |
Скачать Выполнить код
3. Использование набора (эффективно)
Чтобы повысить производительность и выполнить работу за линейное время, вы можете использовать set
структура данных.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] visited = set() dup = [x for x in nums if x in visited or (visited.add(x) or False)] print(dup) # [1, 5, 1] |
Скачать Выполнить код
Чтобы получить каждый дубликат только один раз, вы можете использовать понимание множества, как показано ниже:
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] visited = set() dup = {x for x in nums if x in visited or (visited.add(x) or False)} print(dup) # {1, 5} |
Скачать Выполнить код
4. Использование count()
функция
Вот альтернативное решение с использованием count()
Функция, которая обеспечивает простой и понятный способ выявления дубликатов в списке. Это не рекомендуется для больших списков, поскольку временная сложность является квадратичной.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = {x for x in nums if nums.count(x) > 1} print(dup) # {1, 5} |
Скачать Выполнить код
5. Использование iteration_utilities
модуль
Наконец, iteration_utilities
модуль предлагает duplicates
функция, которая дает повторяющиеся элементы. Вы можете использовать это как:
from iteration_utilities import duplicates if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = list(duplicates(nums)) print(dup) # [1, 5, 1] |
Чтобы получить каждый дубликат только один раз, объедините его с unique_everseen()
:
from iteration_utilities import unique_everseen if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = unique_everseen(duplicates(nums)) print(dup) # [1, 5] |
Это все, что касается поиска повторяющихся элементов в списке в Python.
Также см:
Удалить повторяющиеся значения из списка Python
Для нахождения одинаковых элементов можно использовать следующий алгоритм:
- Находим количество вхождений (сколько раз встречается в списке) для каждого элемента
- Выводим только те, у которых количество вхождений больше 1
Алгоритм можно реализовать с помощью цикла:
const numbers = [4, 3, 3, 1, 15, 7, 4, 19, 19]; // исходный массив
const countItems = {}; // здесь будет храниться промежуточный результат
// получаем объект в котором ключ - это элемент массива, а значение - сколько раз встречается элемент в списке
// например так будет выглядеть этот объект после цикла:
// {1: 1, 3: 2, 4: 2, 7: 1, 15: 1, 19: 2}
// 1 встречается в тексте 1 раз, 2 встречается 2 раза, 4 встречается 2 раза и так далее
for (const item of numbers) {
// если элемент уже был, то прибавляем 1, если нет - устанавливаем 1
countItems[item] = countItems[item] ? countItems[item] + 1 : 1;
}
// обрабатываем ключи объекта, отфильтровываем все, что меньше 1
const result = Object.keys(countItems).filter((item) => countItems[item] > 1);
console.dir(result); // => ['3', '4', '19']
0 / 0 / 1 Регистрация: 24.02.2014 Сообщений: 166 |
|
1 |
|
Поиск одинаковых элементов массива07.11.2014, 12:24. Показов 27802. Ответов 6
Помогите написать программу на поиск одинаковых элементов массива
0 |
zss Модератор 13100 / 10373 / 6206 Регистрация: 18.12.2011 Сообщений: 27,741 |
||||
07.11.2014, 12:54 |
2 |
|||
0 |
Jedi01 0 / 0 / 1 Регистрация: 24.02.2014 Сообщений: 166 |
||||
07.11.2014, 13:45 [ТС] |
3 |
|||
На моей программе выявляется 5 ошибок. А вы с какой программой пользуетесь? Миниатюры
0 |
Catstail Модератор 35427 / 19452 / 4071 Регистрация: 12.02.2012 Сообщений: 32,488 Записей в блоге: 13 |
||||
07.11.2014, 14:06 |
4 |
|||
Эх, горюшко…
1 |
Jedi01 0 / 0 / 1 Регистрация: 24.02.2014 Сообщений: 166 |
||||
08.11.2014, 15:04 [ТС] |
5 |
|||
Это правильный ответ? Работающая программа? Миниатюры
0 |
Catstail Модератор 35427 / 19452 / 4071 Регистрация: 12.02.2012 Сообщений: 32,488 Записей в блоге: 13 |
||||
08.11.2014, 15:23 |
6 |
|||
Не совсем. Правильно так:
2 |
мама Стифлера из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,426 Записей в блоге: 14 |
||||
19.12.2019, 04:20 |
7 |
|||
А если увеличить до 10 и сделать больше одинаковых:
код начинает парить мозги. Показывает то все ячейки сравнений верно, но лишние визуальные совпадения сбивают с толку Код одинаковые значения 3 в №0 и №2 одинаковые значения 3 в №0 и №4 одинаковые значения 3 в №0 и №5 одинаковые значения 3 в №2 и №4 одинаковые значения 3 в №2 и №5 одинаковые значения 3 в №4 и №5 -------------------------------- Process exited after 0.1073 seconds with return value 0 Для продолжения нажмите любую клавишу . . .
0 |