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

У меня есть 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.