Comparați fiecare element cu fiecare alt element din ArrayList (Programare, Java, Algoritm, Sortare, Arraylist, Comparați)

JavaKungFu a intrebat.

Am probleme cu ceea ce am crezut că ar trebui să fie o problemă destul de simplă.

Am nevoie să compar fiecare element dintr-o arrayList cu fiecare alt element din listă fără a compara elementele între ele. Nu este la fel de simplu ca apelarea unei comparații equals(), ci implică o logică personalizată pe care am omis-o din codul meu de mai jos. De asemenea, ArrayList nu ar trebui să fie modificată în niciun fel.

Problema pe care se pare că o am este că, odată ce intru în cea de-a doua buclă, nu știu dacă mai am un alt obiect cu care să compar (deoarece este o listă de dimensiuni variabile).

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
    }
}

Cred că, probabil, am procedat greșit, sunt deschis la sugestii sau sfaturi despre cum să fac acest lucru mai bine.

Comentarii

  • Spuneți că ArrayList nu ar trebui să fie modificată în niciun fel, deci dimensiunea listei nu este variabilă: este constantă. Iar i+1 va fi astfel un index valid pentru listIterator(), deoarece i este garantat a fi < list.size(), iar listIterator acceptă un index până la list.size() inclusiv. Astfel, codul dumneavoastră (odată ce erorile de sintaxă banale sunt corectate) ar trebui să funcționeze așa cum este. –  > Por JB Nizet.
  • Minunat, această întrebare m-a ajutat enorm! –  > Por luckytaxi.
  • Pe la CR, acest lucru s-ar putea potrivi Nu este atât de ușor pe cât pare (mai ales cu o structură nesimetrică compare și generală java.util.List<>. Începând cu compare every item in [a List L] with every other item in [L] –  > Por greybeard.
5 răspunsuri
Kaleb Brasee
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)
  }
}

Comentarii

  • Acest lucru va face mai multe comparații decât este necesar, veți testa dacă item1 == item3 și item3 == item1 –  > Por Mike.
  • Da, tocmai mi-am dat seama că făcea unele comparații inutile, am actualizat codul. –  > Por Kaleb Brasee.
  • @Mike nu, deoarece bucla interioară ia doar elementele care sunt „în spatele” indexului curent din bucla exterioară. –  > Por Martin Klinke.
  • La început am inițializat j = 0, apoi am reparat. –  > Por Kaleb Brasee.
  • Da, chiar funcționează, nu sunt sigur de ce am încercat să folosesc un iterator, am crezut că este singura modalitate de a obține o sub-listă. Soluția a fost simplă, doar că m-am gândit prea mult la asta. Mulțumesc.  > Por JavaKungFu.
Nikita Rybak

Care este problema cu utilizarea for bucla în interior, la fel ca în exterior?

for (int j = i + 1; j < list.size(); ++j) {
    ...
}

În general, de la Java 5, am folosit iteratori doar o dată sau de două ori.

Comentarii

  • Ar trebui să citiți articolul 46 din Effective Java, acesta recomandă în mod explicit împotriva buclelor for tradiționale (ori de câte ori este posibil) –  > Por Sean Patrick Floyd.
  • @Sean Patrick Floyd, JVM poate utiliza intrinsec pentru asta, dacă este necesar. Nu spun în acest moment că folosește, dar iteratorul este cel mai ușor lucru care poate fi eliminat prin optimizare (prin intermediul analizei de evadare) –  > Por bestsss.
  • @bestsss Nu vorbesc despre un cod de octeți eficient (și nici Josh Bloch, în acest caz), ci despre un cod sursă lizibil și fără erori –  > Por Sean Patrick Floyd.
Piotr Jankowski

În unele cazuri, aceasta este cea mai bună cale, deoarece codul dvs. poate să fi schimbat ceva și j=i+1 nu va verifica acest lucru.

for (int i = 0; i < list.size(); i++){  
    for (int j = 0; j < list.size(); j++) {
                if(i == j) {
               //to do code here
                    continue;
                }

}

}

Comentarii

  • One interpretare a compare every item in [a List L] with every other item in [L]. Ar putea fi timpul să reflectăm/prezentăm o java.util.streamabordare bazată pe – – pity Stream este obligat să fie clonabil și să ofere o funcție utilă. equals() la fel de mult ca Iterator. –  > Por greybeard.
BrnLng

Acest cod m-a ajutat să obțin acest comportament: Cu o listă a,b,c, ar trebui să obțin comparat ab, ac și bc, dar orice altă pereche ar fi în exces / nu este necesară.

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);
    }
}

Bucla merge ca în această imagine:Exemplu vizual de comparație triunghiulară

sau ca aceasta:

   |   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  |  ·               

totalul comparațiilor este un număr triunghiular (n * n-1)/2

Karthick

Următorul cod va compara fiecare element cu o altă listă de elemente folosind metoda contains().Lungimea buclei for trebuie să fie mai mare decât dimensiunea() listei mai mari, numai atunci se vor compara toate valorile din ambele liste.

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)));
}

Ieșirea este adevărată sau falsă.