2016-05-29 8 views
1

Ich versuche doppelte Anzahl in einem Array zu finden, aber ich habe ein Problem wenn die Zahl in dem Feld, das mehr als 2 Nummer dupliziert es wie dieseDoppelnummer im Array findet java

Dupicate Nummer gedruckt wird ist: 40

Doppelte Zahl ist: 40

das nicht korrekt ist. Also, ich möchte nur nur Nummer, die doppelt und wie viele sie auftreten, zu drucken. das ist mein Code unten.

public static void main(String[] args) 
{ 

    Scanner sc = new Scanner(System.in); 

    int[] x = { 
     10, 20, 30, 40, 40, 40, 25 
    }; 

    int count = 0; 

    for (int i = 1; i < x.length; i++) { 
     if (x[i - 1] == x[i]) { 
      System.out.println("Dupicate number is :" + x[i]); 
      count++; 
     } 
    } 

    System.out.println(count); 

} 
+0

Oh, müssen die Duplikate auch in Folge ?, dann ist meine Antwort falsch, natürlich – Turo

Antwort

0

Verwenden HashSet fro Java Util:

// x is name of your array 
int[] x = { 
    3, 4, 4, 5, 6 
}; 
HashSet <Integer> mySet = new HashSet <Integer>(); 
ArrayList <Integer> dlist = new ArrayList <Integer>(); 

for (int val: x) { 
    if (!mySet.add(val)) { 
     dlist.add(val); 
    } 
} 

for (int i = 0; i < dlist.size(); i++) { 
    System.out.println(dlist.get(i)); 
} 

Nun enthält die newArr nur Elemente nicht wiederholt.

Anzahl der Duplikate = x.length - newArr.length

+0

und woher wissen Sie, welches das Duplikat ist? – Turo

+0

Schleife und prüfen, ob es existiert oder nicht. Warten Sie, ich werde es zu meinem Code hinzufügen –

+0

Aber jeder Wert * wird * existieren. – Andreas

1

Lege die Anordnungselemente in einer hashmap dass die Zählung hält. dann iterieren über die Karte. Du findest also auch alle Duplikate.

public static void main(String[] args) 

{ 

    int[] x = { 10, 20, 30, 40, 40, 40, 25 }; 
    Map<Integer, Integer> count = new HashMap<>(); 
    for (int i = 1; i < x.length; i++) { 
//  if (count.containsKey(x[i]) && (x[i] == x[i-1]) ) { 
//  use this if the duplicates must be consecutive 
     if (count.containsKey(x[i])) { 
      count.put(x[i], count.get(x[i]) + 1); 
     } else { 
      count.put(x[i], 1); 
     } 
    } 
    for (Entry<Integer, Integer> entry : count.entrySet()) { 
     if (entry.getValue() > 1) { 
      System.out.println("Dupicate number is :" + entry.getKey() + " " + entry.getValue() + " occurences"); 
     } 
    } 
} 

EDIT Hinzugefügt wurde die Änderung für aufeinanderfolgende Doppelungen in den Kommentaren, aber dies findet nur die letzte doppelte

+0

'put (get() + 1)' bedeutet, dass der Wert ungeboxt und der Wert neu geladen wird. Die Verwendung von 'AtomicInteger.incrementAndGet()' wäre besser für die Leistung. 'int [1]' wäre noch besser. – Andreas

+0

Sie haben Recht, mit einigem Nachdenken hätte ich 1 Boxing gemacht: Integer value = x {i]; und count.put (Wert, count.get (Wert) ++). – Turo

+0

Habe gerade einen kleinen Leistungstest gemacht. 'AtomicInteger' ist etwas besser als Boxen. 'int [1]' läuft in weniger als der Hälfte der Zeit der anderen beiden, also ist 'int [1]' definitiv der richtige Weg. – Andreas

-1

Eine praktische Lösung unter Verwendung von Sammlungen werden würde: das Array in eine Liste drehen, das Verfahren Collections.frequency(a, b) wird zurückgeben, wie oft b in der Sammlung a vorhanden ist, also müssen Sie die Liste iterieren und dann eine Karte mit dem Ergebnis dieser Methode ausfüllen

Beispiel:

public static void main(String[] args) { 
    int[] x = { 10, 20, 30, 40, 40, 40, 25 }; 
    List<Integer> myInts = new ArrayList<Integer>(); 

    for (int index = 0; index < x.length; index++) { 
     myInts.add(x[index]); 
    } 
    Map<Integer, Integer> ss = new HashMap<Integer, Integer>(); 
    for (int index = 0; index < x.length; index++) { 
     if (Collections.frequency(myInts, x[index]) > 1) { 
      ss.put(x[index], Collections.frequency(myInts, x[index])); 
     } 
    } 
    System.out.println(ss); 
} 

wird dieser Code

{40 = 3}

drucken, das eigentlich ist, was Sie suchen.

+0

Das ist ein * sehr * langsamer Weg, es zu tun. Rufen Sie für jedes Element 'frequency()' auf, das die gesamte Liste erneut scannt, und wenn der Wert> 1 ist, führen Sie einen weiteren * vollständigen Scan durch, um die bereits erhaltene Nummer zu finden. 'O (n^2)' * Huch! * – Andreas