2016-05-10 6 views
0

Ich versuche, einen Code zu schreiben. Dort erhalte ich maximal 1000 (int) Eingaben von einem Benutzer (es muss Array [1000] sein) und es werden die Ints in derselben Reihenfolge ausgedruckt, in der sie gelesen wurden. Das Lesen kann mit Strg + Z gestoppt werden wenn der Benutzer das möchte. Das Programm schreibt keine Dublettennummern aus.So überprüfen Sie doppelte Nummern und drucken die gelesenen Eingangsnummern in der gleichen Reihenfolge aus, in der sie gelesen wurden (mit Ausnahme aller Duplikate.)

Beispiel;

Input: 45 77 -22 3 45 0 21 -1 3 Output: 45 77 -22 3 0 21 -1

bisher i codiert hat (innerhalb von 2 Tagen);

static int i = 0; 
public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    int[] array = new int[1000]; 
    int[] arrayCopy = new int[1000]; 

    int k=0,j=0; 

    System.out.println("enter your integer numbers"); 
    while(input.hasNext()) 
    { 
     array[i] = input.nextInt(); 


     for(j =0 ; j< array.length; j++) 
     { 
      arrayCopy[j] = array[j]; 

     } 


     for(k =1; k<arrayCopy.length; k++) 
     { 
      int aV = arrayCopy[k]; 

     } 
     i++; 

    } 

    input.close(); 
} 

}

Antwort

1

Verwenden Sie eine HashMap, um die bereits angezeigten Zahlen zu verfolgen. Füge nur zu deiner Ausgangszeichenfolge hinzu, wenn es sich um eine neue Nummer handelt. Sie können den Code mit der folgenden ändern:

int[] array = new int[1000]; 
Scanner input = new Scanner(System.in); 
int index = 0; 
while(input.hasNext()) { 
    array[index] = input.nextInt(); 
    index++; 
} 

HashMap<Integer, Boolean> seenNumbers = new HashMap<Integer, Boolean>(); 
String result = ""; 
for (int i = 0; i < index; i++) { 
    int value = array[i]; 
    if (!seenNumbers.containsKey(value)) { 
     result += " " + value; 
     seenNumbers.put(value, true); 
    } 
} 

System.out.println(result); 
+0

Hallo agin @dharms nicht bewahrt Ich mag würde lernen, was diejenigen Code zu tun, wenn ich nicht bin stört Sie (könnten Sie bitte erklären); if (! seenNumbers.containsKey (Wert)) { Ergebnis + = "" + Wert; seenummers.put (value, true); } und warum haben Sie hashmap anstelle von hashset verwendet? Vielen Dank –

+0

Das prüft, ob der aktuelle 'int' bereits in der Map ist und nur gedruckt wird, wenn dies nicht der Fall ist. Sie können entweder eine HashMap oder HashSet verwenden, um dies zu erreichen. Ein HashSet implementiert tatsächlich eine HashMap hinter den Kulissen, sodass Sie eine Map unabhängig von Ihrer Wahl verwenden. – dharms

0

anstelle von Array ein. Set wird keine Duplikate hinzufügen.

+0

Hashset nicht Reihenfolge der Einfügungen –

1

Die einfachste Lösung für mich ist LinkedHashSet zu verwenden - nicht Duplikate erlauben und bewahrt Auftrag

Set <Integer> set = new LinkedHashSet<>(1000); 
while (input.hasNext()) { 
int next = input.nextInt(); 
set.add(next); 
} 
input.close(); 
for (Integer number : set) { 
System.out.print(number+" ");} 

Arbeit sollte

1

Vorausgesetzt, Sie können eine Sortierreihenfolge auflösen und Arrays verwenden:

Unter Pseudocode und Daten. Es ist als Array geschrieben, aber Sie können immer Schleife, wo erforderlich. Ich schreibe auch die Daten ohne Kommas, so wie meine Sprache Dyalog APL ausgibt ;-), aber die Daten unten sind einfach 9-Elemente 1-dimensionale Arrays. Das Ergebnis scheint 7 Elemente zu enthalten.

Sie haben

A = 45 77 -22 3 45 0 21 -1 3 

die Reihenfolge aufsteigend sortieren Resolve A für:

order = 3 8 6 4 9 7 1 5 2 // A[3] is smallest, then A[8], A[6], etc. 

schreiben:

B = A[order] // B now holds: -22 -1 0 3 3 21 45 45 77 

Schleife durch alle, aber das erste Element von B, überprüfen, ob nächste Element ist wie Strom. Schreibe das Ergebnis zu C, die eine gleiche Länge Vektor von Nullen ist jedoch erste Element C sein muss 1:

C = 1 0 0 0 0 0 0 0 0 
s = 2 
:While (s <= [length of C]) 
    C[s] = (B[s-1] == B[s]) // C[s] is 0 or 1 
    s += 1 
:End 

Nun hält C:

1 1 1 1 0 1 1 1 0 

eine leere Variable D Erstellen (oder einfach kopieren von A oder B - Sie werden es überschreiben):

D = A 

die Elemente von D Weisen Sie wie folgt vor:

D[order] = C // D now holds: 1 1 1 1 0 1 1 1 0 

Nimm nur D Elemente von A (Du nimmst Elemente von A und fügst sie an ein Ergebnis an, das anfänglich leer ist - d. H.hat null Länge): jetzt

s = 1 
:While (s <= [lenght of A]) 
    :if D[s] // Means: If (D[s] == 1) 
     [append A[s] to Result] 
     s += 1 
    :End 
:End 

Ergebnis enthält

45 77 -22 3 0 21 -1