сравните каждый элемент с любым другим элементом в arraylist

<p>у меня проблемы с тем, что я думал, должно быть довольно простой проблемой.</p><p>мне нужно сравнить каждый элемент в arraylist с каждым другим элементом в списке, не сравнивая элементы с самим собой. это не так просто, как вызывать сравнение equals (), оно включает в себя некоторую пользовательскую логику, которую я опустил в своем коде ниже. также arraylist не должен быть изменен в любом случае. </p><p>мне кажется, что проблема в том, что, как только я попадаю во второй цикл, я не знаю, есть ли у меня другой объект для сравнения (так как это список переменного размера).</p><pre><code>for(int i =0; i< list.size(); i++){ //get first object to compare to string a = list.get(i).geta(); iterator itr = list.listiterator(i + 1 ); // i don't know if i + 1 is valid while(itr.hasnext()){ // compare a to all remaining items on list } } </code></pre><p>я думаю, что я, вероятно, иду по этому пути неправильно, я открыт для предложений или советов о том, как сделать это лучше. </p>

<pre><code>for (int i = 0; i < list.size(); i++) { for (int j = i+1; j < list.size(); j++) { // compare list.get(i) and list.get(j) } } </code></pre>

<p>в чем проблема с использованием цикла <code>for</code> внутри, как снаружи?</p><pre><code>for (int j = i + 1; j < list.size(); ++j) { ... } </code></pre><p>в общем, начиная с java 5, я использовал итераторы только один или два раза.</p>

<p>в некоторых случаях это лучший способ, потому что ваш код может что-то изменить, и j = i + 1 не будет проверять это.</p><pre><code>for (int i = 0; i < list.size(); i++{ for (int j = 0; j < list.size(); j++) { if(i == j) { continue; } } </code></pre>

<p>следующий код будет сравнивать каждый элемент с другим списком элементов, используя метод contains (). длина цикла for должна быть больше (), чем размер большего списка, тогда он будет сравнивать только значения обоих списков.</p><pre><code>list<string> str = new arraylist<string>(); str.add("first"); str.add("second"); str.add("third"); list<string> str1 = new arraylist<string>(); str1.add("first"); str1.add("second"); str1.add("third1"); for (int i = 0; i<str1.size(); i++) { system.out.println(str.contains(str1.get(i))); } </code></pre><p>вывод true true false</p>

<p>этот код помог мне получить такое поведение: со списком a, b, c я должен сравнивать ab, ac и bc, но любая другая пара будет избыточной/ненужной.</p><pre><code>import java.util.*; import static java.lang.system.out; // rl = rawlist; lr = listreversed arraylist<string> rl = new arraylist<string>(); arraylist<string> lr = new arraylist<string>(); rl.add("a"); rl.add("b"); rl.add("c"); rl.add("d"); rl.add("e"); rl.add("f"); lr.addall(rl); collections.reverse(lr); for (string itema : rl) { lr.remove(lr.size()-1); for (string itemz : lr) { system.out.println(itema + itemz); } } </code></pre><p>цикл выглядит так, как показано на рисунке: <a href="https://i.stack.imgur.com/dxgfc.png">визуальный пример треугольного сравнения</a> </p><p>или как это:</p><pre><code> | f e d c b a ------------------------------ a | af ae ad ac ab · b | bf be bd bc · c | cf ce cd · d | df de · e | ef · f | · </code></pre><p>общее сравнение представляет собой треугольное число (n * n-1)/2</p>