Vergleich zweier Arrays

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo Leute,
ja, ich weiss, dass die Überschrift ein mit Sicherheit schon längst durchgekautes Thema ist, jedoch handelt es sich (meiner Meinung nach) bei meiner Frage um etwas Spezifischeres...

Ich habe zwei String[] - Arrays mit jeweils unterschiedlicher Länge und verschiedensten Wörtern als Objekte. Nun möchte ich jedoch schauen wie die Schnittmenge der zwei Arrays aussieht, d.h. wie viele Wörter sie gemeinsam haben. Die Wörter an sich brauche ich eigentlich nicht, sondern eher die Zahl als Ergebnis...

Und glaubt bitte nicht, dies wäre irgendeine Hausaufgabe oder wasauchimmer....ich bin lediglich total durcheinander nach verschiedensten Versuchen mit HashSets, etc.

Für Hilfe wäre ich dankbar!
MfG
 

Marco13

Top Contributor
Ja, mit HashSets würde das gehen - so grob aus dem Kopf(!)

Set<String> s0 = new HashSet<String>(Arrays.asList(array0));
Set<String> s1 = new HashSet<String>(Arrays.asList(array1));
s1.retainAll(s0);
int common = s1.size();

oder eben zwei Schleifen (vmtl. deutlich effizienter)
Code:
int common = 0;
for (String s0 : array0)
{
    for (String s1 : array1)
    {
        if (s0.equals(s1)) common++;
    }
}
 

Ebenius

Top Contributor
Marco13 hat gesagt.:
oder eben zwei Schleifen (vmtl. deutlich effizienter)

Nur bei kleinen Arrays. Wenn's größer wird, ist's mit Sets wahrscheinlich wesentlich schneller. Außerdem unterscheidet sich die Anzahl, sofern Worte mehrfach vorkommen. Schnittmenge heißt ja distinkt. Daher fällt die Array-Möglichkeit eigentlich weg.

Ich würde's wahrscheinlich so machen:
Code:
final Set<String> schnittMenge = new HashSet<String>(Arrays.asList(array0));
schnittMenge.retainAll(Arrays.asList(array1));

Test mit array0=4000, array1=10000 Zufalls-Strings, 900 überschneidungen:
Code:
First test: two loops
	... took 1158ms
Second test: HashSet retain all
	... took 450ms
Third test: TreeSet retain all
	... took 452ms

Ebenius
 

Marco13

Top Contributor
Ebenius hat gesagt.:
Marco13 hat gesagt.:
oder eben zwei Schleifen (vmtl. deutlich effizienter)

Nur bei kleinen Arrays. Wenn's größer wird, ist's mit Sets wahrscheinlich wesentlich schneller.

:oops: Wär' nicht schlecht wenn mir jetzt spontan eine tolle Ausrede dafür einfallen würde, dass ich O(n^2) als potentiell effizienter als O(n) bezeichnet habe.... :oops:
 

Ebenius

Top Contributor
Marco13 hat gesagt.:
Wär' nicht schlecht wenn mir jetzt spontan eine tolle Ausrede dafür einfallen würde, dass ich O(n^2) als potentiell effizienter als O(n) bezeichnet habe....

Kein Problem, ich helf Dir! Effizienter... Mal sehen... Das ist doch abhängig von der Perspektive. Zum Beispiel ist der Schleifenansatz effizienter, weil er
  • weniger API-Wissen voraussetzt, wodurch man kostbare Entwicklungszeit spart die man zum Lernen verbraten müsste,
  • keinen weiteren Speicher auf dem Heap belegt und
  • nicht so viele spitze Klammern verschwendet.
:)

BTW: Wenn Du die Schleifen mit break aufbaust, dann sparst Du in meinem Test oben fast 300ms. Immerhin was:
Code:
int count = 0;
for (String s0 : array0) {
  for (String s1 : array1) {
    if (s0.equals(s1)) {
      count++;
      break;
    }
  }
}

Ebenius
 

Ebenius

Top Contributor
:oops: In meinem Test oben... Wenn Du in die Schleifenlösung den Hash-Code einbeziehst, dann wird's rasant:
Code:
for (String s0 : array0) {
  for (String s1 : array1) {
    if (s0.hashCode() == s1.hashCode() && s0.equals(s1)) {
      count++;
      break;
    }
  }
}
Ergebnis:
Code:
First test: two loops
	... took 248ms
Second test: hash set retain all
	... took 539ms
Second test: tree set retain all
	... took 535ms

Ich hab die Testwerte verändert (von der Hälfte bis zum Achtfachen jedes oben angebenen Wertes hab ich getestet), das Verhältnis der Zeiten bleibt so ähnlich. Also - die Schleifen sind mit Hash-Code wesentlich schneller als die Sets, wenn man den Hash-Code in der Schleife nimmt. Hätte ich nicht mal ansatzweise gedacht...

// Nachtrag: Hängt allerdings arg von den Daten ab, die in den Arrays liegen. Komme auch öfter auf deutlich umgekehrte Ergebnisse. Ich würde noch immer die HashSet-Lösung nehmen. Wahrscheinlich müsste ich mich jetzt mit ner sinnvollen Belegung der Daten beschäftigen. Das lasse ich mal.

Ebenius
 

Marco13

Top Contributor
Ja, bei kleinen Arrays ist die Array-Lösung effizienter weil eben keine neuen Objekte angelegt werden müssen (und die Daten nicht in die HashSet kopiert werden müssen). Bei größeren Arrays kehrt sich das sehr schnell um (deswegen ja auch immer die asymptotische Laufzeitangabe...).

Sieht man sehr schön bei diesem Programm: Das plottet mal die zeitlichen Verläufe für Arraygrößen 1 bis 50. Am Anfang sind die Loop-Lösungen schneller, aber weil die Set-Lösung nur O(n) ist, und die loop-Lösungen O(n^2), "überholt" die Set-Lösung (rot) die Loop-Lösungen schon bei Arrays der Größe 25...
Code:
import java.util.*;
import java.util.List;
import javax.swing.*;
import java.awt.*;

class TimePlot extends JPanel
{
    float max = -1;
    List<List<Float>> lists = null;

    public TimePlot(List<List<Float>> lists)
    {
        this.lists = lists;

        for (List<Float> list : lists)
        {
            for (Float n : list)
            {
                max = Math.max(max, n);
            }
        }
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        for (int j=0; j<lists.size(); j++)
        {
            List<Float> list = lists.get(j);
            switch (j)
            {
                case 0: g.setColor(Color.RED); break;
                case 1: g.setColor(Color.GREEN); break;
                case 2: g.setColor(Color.BLUE); break;
            }
            for (int i=1; i<list.size(); i++)
            {
                float scaleX = (float)getWidth() / list.size();
                float scaleY = (float)getHeight() / max;
                int x0 = (int)((i-1) * scaleX);
                int y0 = (int)(list.get(i-1) * scaleY);
                int x1 = (int)(i * scaleX);
                int y1 = (int)(list.get(i) * scaleY);
                g.drawLine(x0, getHeight()-y0, x1, getHeight()-y1);

                System.out.println("list at "+i+" has "+list.get(i)+" y "+y1);
            }
        }
    }
}


class Plotter extends JFrame
{
    public Plotter(List<Float> ... lists)
    {
        setSize(500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(new TimePlot(Arrays.asList(lists)));
    }
}



class ArrayIntersectionTest
{
    private static String array0[];
    private static String array1[];

    public static void main(String args[])
    {
        List<Float> timesS = new ArrayList<Float>();
        List<Float> timesL = new ArrayList<Float>();
        List<Float> timesH = new ArrayList<Float>();

        for (int size=1; size<=50; size+=1)
        {
            array0 = createInput(size, 50);
            array1 = createInput(size, 50);
            for (int i=0; i<100; i++)
            {
                int index = (int)(Math.random()*array0.length);
                array0[index] = array1[index];
            }
            int runs = 500000 / size;
            System.out.println("Size "+size);
            timesS.add((float)testSet(runs) / runs);
            timesL.add((float)testLoop(runs) / runs);
            timesH.add((float)testLoopWithHashCode(runs) / runs);
        }

        new Plotter(timesS, timesL, timesH).setVisible(true);
    }

    private static String[] createInput(int size, int len)
    {
        Set<String> s = new HashSet<String>();
        while (s.size() < size)
        {
            s.add(createRandomString(len));
        }
        return (String[])s.toArray(new String[s.size()]);
    }

    private static String createRandomString(int len)
    {
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<len; i++)
        {
            sb.append('A'+(char)(Math.random()*('Z'-'A')));
        }
        return sb.toString();
    }





    private static long testSet(int n)
    {
        long before = System.currentTimeMillis();
        int result = 0;
        for (int i=0; i<n; i++)
        {
            result += set();
        }
        long after = System.currentTimeMillis();
        System.out.println(result+" set              "+(after-before));
        return (after-before);
    }

    private static long testLoop(int n)
    {
        long before = System.currentTimeMillis();
        int result = 0;
        for (int i=0; i<n; i++)
        {
            result += loop();
        }
        long after = System.currentTimeMillis();
        System.out.println(result+" loop             "+(after-before));
        return (after-before);
    }

    private static long testLoopWithHashCode(int n)
    {
        long before = System.currentTimeMillis();
        int result = 0;
        for (int i=0; i<n; i++)
        {
            result += loopWithHashcode();
        }
        long after = System.currentTimeMillis();
        System.out.println(result+" loopWithHashcode "+(after-before));
        return (after-before);
    }


    private static int set()
    {
        Set<String> s0 = new HashSet<String>(Arrays.asList(array0));
        Set<String> s1 = new HashSet<String>(Arrays.asList(array1));
        s1.retainAll(s0);
        return s1.size();
    }

    private static int loopWithHashcode()
    {
        int count = 0;
        for (String s0 : array0)
        {
            for (String s1 : array1)
            {
                if (s0.hashCode() == s1.hashCode() && s0.equals(s1))
                {
                    count++;
                    break;
                }
            }
        }
        return count;
    }

    private static int loop()
    {
        int count = 0;
        for (String s0 : array0)
        {
            for (String s1 : array1)
            {
                if (s0.equals(s1))
                {
                    count++;
                    break;
                }
            }
        }
        return count;
    }


}
 

André Uhres

Top Contributor
Anonymous hat gesagt.:
wie viele Wörter sie gemeinsam haben
Hier ist eine einfache "Merge" Lösung:
Code:
import java.util.*;
import javax.swing.*;
public class MergeDemo {
    String[] wordlistA = {"java", "is", "a", "good", "developing", "language", "is", "it", "not"};
    String[] wordlistB = {"java", "is", "a", "good", "programming", "language", "it", "is", "indeed"};
    private int indexA,  indexB,  count;
    private String wordA,  wordB,  word;
    private boolean countDuplicates;
    public MergeDemo() {
        int opt = JOptionPane.showConfirmDialog(null, "Count Duplicates?");
        countDuplicates = opt == JOptionPane.YES_OPTION ? true : false;
        Arrays.sort(wordlistA);
        Arrays.sort(wordlistB);
        indexA = -1;
        indexB = -1;
        wordA = nextA();
        wordB = nextB();
        while (wordA.startsWith("0") && wordB.startsWith("0")) {
            int compareValue = wordA.compareTo(wordB);
            if (compareValue == 0) {//equal
                word = wordA;
                count++;
                wordA = nextA();
                wordB = nextB();
                if (!countDuplicates) {
                    while (wordA.equals(word)) {
                        wordA = nextA();
                    }
                    while (wordB.equals(word)) {
                        wordB = nextB();
                    }
                }
            } else if (compareValue < 0) {
                wordA = nextA();
            } else {
                wordB = nextB();
            }
        }
        JOptionPane.showMessageDialog(null, "count: " + count);
    }
    private String nextA() {
        if (++indexA < wordlistA.length) {
            return "0" + wordlistA[indexA];
        }
        return "1";
    }
    private String nextB() {
        if (++indexB < wordlistB.length) {
            return "0" + wordlistB[indexB];
        }
        return "1";
    }
    public static void main(final String[] args) {
        new MergeDemo();
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
G Klassen Vergleich zweier Klassen Java Basics - Anfänger-Themen 23
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
N Methoden Methode zum Vergleich zweier Geburtstage Java Basics - Anfänger-Themen 5
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
L vergleich zweier texte Java Basics - Anfänger-Themen 18
B Vergleich zweier Objekte durch "Hashfunktion" Java Basics - Anfänger-Themen 12
K Vergleich zweier Objekte in einer HashMap Java Basics - Anfänger-Themen 6
N Vergleich zweier Elemente verschiedener Vectoren Java Basics - Anfänger-Themen 2
G Vergleich zweier 'long'-Werte. Problem! Java Basics - Anfänger-Themen 6
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
Zeppi Vergleich von Array-Inhalten Java Basics - Anfänger-Themen 14
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
W Vergleich von DatenPaketen Java Basics - Anfänger-Themen 6
B String vergleich Java Basics - Anfänger-Themen 3
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
V Fließkommazahlen Vergleich Java Basics - Anfänger-Themen 7
J Vergleich Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
T Vergleich und Ausgabe von Zahlen Java Basics - Anfänger-Themen 1
J Fehler bei Vergleich auf den grössten Wert Java Basics - Anfänger-Themen 2
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
T Input/Output String-Vergleich schlägt fehl Java Basics - Anfänger-Themen 7
W Konvertierung und Vergleich unterschiedlicher Zeitformate Java Basics - Anfänger-Themen 11
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
M String-Vergleich und NullPointerException Java Basics - Anfänger-Themen 4
L PW-Vergleich Java Basics - Anfänger-Themen 5
S Vergleich von Listen Java Basics - Anfänger-Themen 6
J vergleich von arrays (benötige Hilfe/Denkanstoß) Java Basics - Anfänger-Themen 16
V Einfacher vergleich von Arrays geht schief Java Basics - Anfänger-Themen 2
T Operatoren Multiplikation nur mit Addition, Subtraktion und Vergleich Java Basics - Anfänger-Themen 29
N Methoden Array vergleich funzt nicht Java Basics - Anfänger-Themen 8
B Char-Vergleich Sonderzeichen Java Basics - Anfänger-Themen 6
S Vergleichsmethode zum Objekt-Vergleich mit < und > Java Basics - Anfänger-Themen 4
F Problem bei Vergleich Java Basics - Anfänger-Themen 3
S File vergleich - Junit Java Basics - Anfänger-Themen 6
P String-Vergleich Java Basics - Anfänger-Themen 3
S Multiplikation durch Addition, Subtraktion und Vergleich von Zahlen Java Basics - Anfänger-Themen 14
W Vergleich ob Buchstabe in einem Wort enthalten ist Java Basics - Anfänger-Themen 3
C String Objekte Vergleich je nach Instanzierung unterschiedlich!!?!! Java Basics - Anfänger-Themen 4
R String-Vergleich Java Basics - Anfänger-Themen 15
C Variablen Vergleich funktioniert nicht Java Basics - Anfänger-Themen 11
J Erste Schritte Vergleich der String-Objekte Java Basics - Anfänger-Themen 17
B Zwei verschiedene Daten vergleich Java Basics - Anfänger-Themen 2
A Variablen Vergleich Java Basics - Anfänger-Themen 5
P Erste Schritte vergleich substring und string Java Basics - Anfänger-Themen 4
G Date - Calender | "Vergleich" Java Basics - Anfänger-Themen 3
M Vergleich mit Toleranz Java Basics - Anfänger-Themen 7
B Objekt Vergleich - Unterschiede ausgeben Java Basics - Anfänger-Themen 4
P Vergleich mit Variablen Java Basics - Anfänger-Themen 6
Y Java Programm URL und String Vergleich! Java Basics - Anfänger-Themen 4
K Vergleich von variable und array Java Basics - Anfänger-Themen 9
H Beim Vergleich/Sortieren mehr als zwei Objekte berücksichtigen Java Basics - Anfänger-Themen 14
P Vergleich von Enums Java Basics - Anfänger-Themen 4
S String Vergleich funktioniert nicht Java Basics - Anfänger-Themen 3
A String-Vergleich geht nicht Java Basics - Anfänger-Themen 2
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
F Methoden Vergleich von int Zahlen Java Basics - Anfänger-Themen 16
F Login Passwort-Vergleich Java Basics - Anfänger-Themen 12
N Vergleich per equals Java Basics - Anfänger-Themen 5
Z XML Vergleich Java Basics - Anfänger-Themen 20
S Herunterladen von Dateien mit Vergleich Java Basics - Anfänger-Themen 6
L Problem String-Vergleich Java Basics - Anfänger-Themen 2
E Objekte-Vergleich Java Basics - Anfänger-Themen 6
Y Datentypen String vergleich Java Basics - Anfänger-Themen 3
R Vergleich von Objekten anhand variierender Kriterien Java Basics - Anfänger-Themen 5
K Datentypen Arrays in Java - Adress-Arithmetik im Vergleich zu Listen Java Basics - Anfänger-Themen 4
S equals vergleich Java Basics - Anfänger-Themen 10
A Datentypen instanceof VS Class - Vergleich Java Basics - Anfänger-Themen 4
M Char vergleich zu Int Java Basics - Anfänger-Themen 10
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
algorismi Ausführungszeit Vergleich == true Java Basics - Anfänger-Themen 8
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
T Zwei listen vergleich und selbige löschen Java Basics - Anfänger-Themen 4
T Vergleich mit Typecasts Java Basics - Anfänger-Themen 3
Screen Eine Frage zu moueMove in applets und deren Vergleich Java Basics - Anfänger-Themen 11
M Vergleich Float-, Doublewert Java Basics - Anfänger-Themen 10
U Methode Vergleich von 2 Arrays Java Basics - Anfänger-Themen 5
S String Vergleich mit Passwort geht nur bei Zahlen ? Java Basics - Anfänger-Themen 7
G Vergleich klappt nicht Java Basics - Anfänger-Themen 3
T Vergleich von generischen Typen Java Basics - Anfänger-Themen 2
C DB Vergleich mit Eingabe Java Basics - Anfänger-Themen 5
G Vergleich großer Basen/Exponenten? Java Basics - Anfänger-Themen 3
F Vergleich von Objekten Java Basics - Anfänger-Themen 2
N Vergleich findet nicht statt. Java Basics - Anfänger-Themen 13
M 2 Fragen: Vergleich, aber wie? Was passiert in diesem Teil? Java Basics - Anfänger-Themen 18
A Vergleich schlägt fehl Java Basics - Anfänger-Themen 15
G Vergleich bei MD5-Verschlüsselung Java Basics - Anfänger-Themen 3
R +1 Vergleich Java Basics - Anfänger-Themen 3
E Char vergleich Java Basics - Anfänger-Themen 7
loadbrain Array vergleich mit 2 for schleifen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben