bernhard.s: Duplikate in einem Array finden

hi,

wie kann ich Duplikate in einem Array finde?
Ich habe folgendes versuch:

var aus="";
var blnDup="";
var strMatch="";
for (i = 1; i < boxSammeln.length; i++){
    strMatch = boxSammeln[i];
   for (j = 1; j < boxSammeln.length; j++){
       blnDup = boxSammeln[i].match("/"+strMatch+"/");
       if (!blnDup){
        aus += i+",  "+strMatch+"  \n";
       }
   }
  }
alert(aus);

leider bekomme ich den gewünschte Ergebnis nicht :-(
Ich habe auch folgendes versucht

for(var i=1; i< boxSammeln.length; i++){
 for(var j=1; j< boxSammeln.length; j++){
  if(boxSammeln[i] == boxSammeln[j]){
   aus += boxSammeln[i]+", +boxSammeln[j]+"\n";
   break;
  }
 }
}

ist leider auch falsch :-(
Kennt eine eine bessere Methode um Duplikate in einem Array zu finden.
Danke im Voraus.

grüße

  1. Hallo,

    wie kann ich Duplikate in einem Array finde?

    <script type="text/javascript">
    <!--
    var namen = new Array("A", "B", "C", "E", "C", "D", "E", "C", "B");

    //findet alle Doppelungen aller Elemente (relativ selbsterklärend)
    var aus ="";
    for (var i = 0; i<namen.length; i++) {
     for (var j = i+1; j<namen.length; j++) {
      if (namen[i] == namen[j]) {
         aus +="doppelt: namen[" + i + "] = " + namen[i] + " und namen[" + j + "] = " + namen[j] + "\n";
      }
     }
    }
    alert(aus);

    //findet je eine Doppelung von Elementen und deren Nachfolger
    var aus ="";
    for (var i = 0; i<namen.length; i++) {
     for (var j = i+1; j<namen.length&&namen[i]!=namen[j]; j++);
     if (j<namen.length) { //nicht bis zum Ende durchgelaufen => eine Doppelung
      aus +="doppelt: namen[" + i + "] = " + namen[i] + " und namen[" + j + "] = " + namen[j] + "\n";
     }
    }
    alert(aus);
    //-->
    </script>

    viele Grüße

    Axel

  2. Hallo bernhard,

    wie kann ich Duplikate in einem Array finde?

    Relativ performanter Algorithmus (Aufwand ist n):

    var namen = Array("A","B","C","D","E","E","A");
    var unique = Array();

    for(i=0;i<namen.length;i++) {
      unique[namen[i]]++;
    }

    for(name in unique) {
      alert(name);
    }

    Gruesse,
     CK

    --
    Auf der ganzen Welt gibt es nichts Weicheres und Schwaecheres als Wasser. Doch in der Art, wie es dem Harten zusetzt, kommt nichts ihm gleich.
    1. Hallo Christian,

      wie kann ich Duplikate in einem Array finde?

      Relativ performanter Algorithmus (Aufwand ist n):

      var namen = Array("A","B","C","D","E","E","A");
      var unique = Array();

      for(i=0;i<namen.length;i++) {
        unique[namen[i]]++;
      }

      for(name in unique) {
        alert(name);
      }

      Das ermittelt aber noch nicht, _welche_ Elemente mehrfach vorkommen. Wenn das auch noch gewünscht ist, steigt der Aufwand auf n + m {n=namen.length; m=unique.length}

      var namen = new Array("A und A", "B und B", "C und \n " + unescape("%D8") + " C", "E und E", "C und C", "D und D", "E und E", "C und \n " + unescape("%D8") + " C", "B und B");
      var unique = new Array();

      for(i=0;i<namen.length;i++) {
        unique[namen[i]] = (unique[namen[i]])?unique[namen[i]]+";"+String(i):String(i);
      }

      for(name in unique) {
        if (unique[name].indexOf(";") != -1)
          alert(name + " kommt vor als Element " + unique[name]);
      }

      Das ist allerdings immer noch besser als meine Lösung. Wobei ich mir noch nicht sicher bin, ist die Frage, ob dieser Algorithmus allgemeingültig(für viele Programmiersprachen) ist, speziell, ob es immer möglich sein wird einen beliebigen String, mit allen möglichen Sonderzeichen, als Index eines assoziativen Arrays zu benutzen.

      viele Grüße

      Axel

      1. Hallo,

        Das ermittelt aber noch nicht, _welche_ Elemente mehrfach vorkommen. Wenn das auch noch gewünscht ist, steigt der Aufwand auf n + m {n=namen.length; m=unique.length}

        wenn das Array zuerst sortiert wird muss nur noch jedes Element mit dem folgenden verglichen werden, und bei Bedarf werden nur die Doppel erfasst.

        Grüsse

        Cyx23