Как петля найти равные слова

У меня есть 1 список массивов, и я хочу пропустить этот список массивов, чтобы найти слова, которые являются одинаковыми в этом списке массивов, потому что мне нужно сохранить этот индексный номер, где они где-то одинаковы. Поэтому я написал этот код ниже, чтобы помочь мне начать работу:

String[] word = new String[] { "abcd", "efgh", "ijkl", "mnop" };
String[] word2 = new String[] { "ijkl", "rstu", "mnop" };
int totalWords = word.length;
int totalWords2 = word2.length;
//Use a List instead of array, because you don't know how many unique there are
List<string> uniqueWords = new ArrayList<>();
for (int i = 0; i < totalWords; i++) { // loop of the first array list
boolean unique = false; for (int j = 0; j < totalWords2; j++) { // second loop where the // words are being compared //compare String this way if (word[i].equals(word2[j])) { //we find two equals strings, it is unique unique = true; break; } } if (unique) { uniqueWords.add(word[i]); }
}
for (String s : uniqueWords) { System.out.println(s);
}
</string>

и он работает и печатает

ijkl
mnop

Теперь я взял тот же код, и я применил его к моей проблеме и получил следующее, но это не сработало. Он просто распечатывает мой список точных массивов. Мне просто нужно сохранить индексный номер, в котором есть равные слова в списке, но он не печатает правильно, поэтому я ничего не могу хранить. Я неправильно подхожу к этой проблеме?

//signatureList is my array list that i want to loop through to find words that are equal with each other
int o = signatureList.size(); //Use a List instead of array, because you don't know how many unique there are List<string> uniqueWords = new ArrayList<string>(); for (int i = 0; i < o; i++) { // loop of the first array list boolean unique = false; for (int j = 1; j < o; j++) { // second loop where the // words are being compared //compare String this way if (signatureList.get(i).equals(signatureList.get(j))) { //we find two equals strings, it is unique unique = true; break; } } if (unique) { uniqueWords.add(signatureList.get(i)); } }
//prints out uniqueWords array list for(int i = 0; i < o ; i++) System.out.println("words that are equal " + uniqueWords.get(i));
</string></string>
5 ответов

public static void main(String[] args) throws Exception { List<string> signatureList = new ArrayList<string>(); signatureList.add("Test"); signatureList.add("asdf"); signatureList.add("jkjk"); signatureList.add("Test"); signatureList.add("1231"); signatureList.add("asdf"); signatureList.add("Test"); Map<string,list<integer>> locations = new HashMap<string,list<integer>>(); for (int i = 0; i < signatureList.size(); i++) { boolean unique = true; for (int j = 0; j < signatureList.size(); j++) { if (i == j) { continue; } if (signatureList.get(i).equals(signatureList.get(j))) { unique = false; break; } } if (!unique) { if(locations.containsKey(signatureList.get(i))){ List<integer> intLocations = locations.get(signatureList.get(i)); intLocations.add(i); locations.put(signatureList.get(i), intLocations); }else{ List<integer> intLocations = new ArrayList<integer>(); intLocations.add(i); locations.put(signatureList.get(i), intLocations); } } } for(Entry<string,list<integer>> en : locations.entrySet()){ System.out.print(en.getKey() + " : "); for(Integer i : en.getValue()){ System.out.print(i + " "); } System.out.println(); }
}
</string,list<integer></integer></integer></integer></string,list<integer></string,list<integer></string></string>

Дает мне выход:

Test : 0 3 6
asdf : 1 5

Полный источник, например, и тестирование. Обязательно пропустите сравнение с самим собой и не добавляйте в список, если он уже находится в списке.

Обновлен мой ответ, чтобы содержать решение для поиска индексов, в которых находятся совпадения.


Еще одна проблема связана с комментариями:

Вы должны сравнивать только два слова, если они имеют другой индекс. Если вы сравниваете слова с одним и тем же индексом (i = j), то, конечно, все они будут включены в результат.


for (int i = 0; i < o; i++) { boolean unique = false; for (int j = 1; j < o; j++) { if (signatureList.get(i).equals(signatureList.get(j))) {// the culprit is here //we find two equals strings, it is unique unique = true; break; } }

Вышеупомянутый код дает вам проблемы. signatureList.get(i).equals(signatureList.get(j) будет истинно как минимум один раз для всех элементов подписи подписи. Таким образом, все элементы добавляются в ваш уникальный список.


Поскольку вам нужен только индекс, подумайте об этом и вместо того, чтобы использовать логическое значение, чтобы определить, что он уникален, просто добавьте индекс в arraylist, избавившись от ненужного оператора if, тем более, что он даже не в правильном цикле,

ArrayList<integer> uniqueWordsIndex = new ArrayList<integer>();
if (signatureList.get(i).equals(signatureList.get(j))) { //we find two equals strings, it is unique uniqueWordsIndex.add(i) break; }
</integer></integer>


Я вижу две разные проблемы: во-первых, вам нужно не делать эту проверку, если i == j, поэтому делайте это только тогда, когда они разные. Вы можете сохранить проверку равенства, просто иметь уникальное число и установить его вместо нуля, а затем увеличить это значение. Если unique > 1 то добавьте его в свой список, когда вы нашли дубликат.

Кроме того, избавиться от неосновательной проверки на unique.

if (signatureList.get(i).equals(signatureList.get(j))) { //we find two equals strings, it is unique unique = true; uniqueWords.add(signatureList.get(i)); break; }

В этом цикле for o не был установлен на длину уникального списка, поэтому вы получите сообщение об ошибке, когда ваша проблема будет исправлена.

for(int i = 0; i < o ; i++)

licensed under cc by-sa 3.0 with attribution.