2009-03-31 15 views
0

Ich habe Probleme beim Vergleich der Werte von Array-Elementen. z.B. Ich wollte den Wert von Index 0 und Index 2 vergleichen, und Index 1 zu Index 3 und so weiter. Mit dem Code unten nehme ich an, das Ergebnis von numOfdifferentShape ist 2, aber ich bekomme 3. Wie kann ich dieses Problem lösen? :-(Elemente des gleichen Arrays vergleichen

int numOfdifferentShape=0; 

myArray = {40.0, 40.0, 40.0, 40.0, 80.0, 40.0, 40.0, 40.0} 

for (int a=0; int a<myArray.size(); a=a+2) 
{ 
    for (int b=a+2; b<myArray.size; b=b+2) 
    { 
     if (!(myArray.get(a).equals(myArray.get(b) && myArray.get(a+1).equals(b+1))) 
     numOfdifferentShape++; 
     break; 
    } 
} 
+0

Sie laufen über die Grenze, wenn a == myArray.size() - 1 (und ähnlich für b). Ihr Code ist zu fehlerhaft. Die zwei Schleife überprüft zum Beispiel. – dirkgently

+0

http://stackoverflow.com/questions/700748/how-to-compare-value-in-array Sie müssen die vorherige Frage, die Sie gestellt haben, nehmen, schauen Sie sich die Antworten an und korrigieren Sie Ihren Code, damit er kompiliert wird. Arrays verwenden [] nicht get(). Arrays haben eine Längenvariable, keine Size() -Methode usw. – TofuBeer

+0

Es ist mir nicht klar, was Sie zu tun versuchen. Kannst du es beschreiben? – DJClayworth

Antwort

3
for (int i = 0; i < (myArray.size() - 2); ++i) 
{ 
    if (myArray[i] != myArray[i + 2]) 
     ++numOfdifferentShapes; 
} 
+0

Ich bearbeitete den Code, um die Tatsache zu reflektieren, dass der ursprüngliche Code Paare zu einem Zeitpunkt vergleicht. Hatte es eine Sequenz {40.0, 40.0 , 80.0, 80.0}, der vorherige Code hätte 2 statt 1 zurückgegeben. – Pesto

+0

Er sagte, er soll 2 bekommen, also denke ich, dass er das will ...? –

+0

Danke Ferdinand..Ich habe einige Änderungen am Code vorgenommen in Ihrem Beispiel und mein Code funktioniert jetzt ... für (int i = 0; i <(meinArray.size() - 2); i = i + 2) { if (! (myArray.get (i) .equals (myArray.get (i + 2)) && myArray.get (i + 1) .equals (meinArray.get (i + 3)))) ++ numOfdifferentShapes; } – Jessy

2
  1. Sie haben zwei Schleifen, schlägt Ihre Beschreibung nur Sie einen wollen
  2. Sie müssen Kontrolle Grenzen tun -. Wollen Sie die n + 2 an den Start wickeln ?. zu Beginn des Array, wenn es um die Länge überschreitet
2

ich denke, Sie Klammern Problem haben Sie geschrieben:

if (!(myArray.get(a).equals(myArray.get(b) && myArray.get(a+1).equals(b+1))) 

, wenn ich denke du meinst:

if (!(myArray.get(a).equals(myArray.get(b)) && myArray.get(a+1).equals(b+1)) 

Auch in der gleichen Zeile, statt:

equals(b+1) 

nicht tun Sie

myArray.get(b+1) 
+0

Ich denke, es ist nur ein Tippfehler (wie die ungültige Array-Definition) - er berichtete seine Code-Läufe, aber gibt nur ein falsches Ergebnis. –

+0

sein Code kann nicht ausgeführt werden ... es ist nicht einmal in der Nähe von gültigem Java. Entweder benutzt er eine Liste oder er benutzt ein Array. Auf Arrays kann nicht so zugegriffen werden, wie er es tut, und Listen können nicht so erstellt werden, wie er es tut. – TofuBeer

+0

ja..myArray.get (b + 1) ... es war Schreibfehler. der Code läuft, aber ich habe nicht das richtige Ergebnis bekommen. – Jessy

4

Es gibt mehrere Syntaxfehler bedeuten in diesem Code, aber da TofuBeer bereits in den Kommentaren darauf hingewiesen hat, werde ich das Design und die Logik vorantreiben.

Geht man vom Code aus, nehme ich an, dass Sie nicht viel Erfahrung mit Java haben und vielleicht gar nicht mit Programmierung. Also werde ich langsam hierher gehen. Ich hoffe, Sie sind nicht durch meine Erklärungen beleidigt.

Sie sagen, dass Sie versuchen herauszufinden, wie viele der Objekte, die Sie in Ihrem Array speichern (wie zwei Ints), gleich sind. Um dies zu tun, müssen Sie verfolgen, welche einzigartigen Objekte Sie bereits gesehen haben. Dann vergleichen Sie jedes Objekt mit der Liste der eindeutigen Objekte und fügen Sie es zur Liste hinzu, wenn es keinem von ihnen entspricht. Dies ist der grundlegende Algorithmus.

Nun, haben Sie bemerkt, dass ich in meiner Beschreibung das Wort "Objekt" verwende? Wenn das passiert, bedeutet das normalerweise, dass Sie einen Kurs machen sollten. Ich würde einen einfachen wie dies macht, die zwei ganzen Zahlen halten:

class Box { // or whatever the objects are called 
    private final int height; 
    private final int width; 
    public Box(int h, int w) { 
     height = h; 
     width = w; 
    } 
    public int getHeight() { 
     return height; 
    } 
    public int getWidth() { 
     return width; 
    } 
    @Override 
    public boolean equals(Object other) { 
     if (!(other instanceof Box)) 
      return false; 
     Box b = (Box) other; 
     return b.height == height && b.width == width; 
    } 
    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 97 * hash + this.height; 
     hash = 97 * hash + this.width; 
     return hash; 
    } 
} 

versuchen zu verstehen, was jeder Teil dieses Code tut (vor allem, wenn dies tatsächlich Ihre Hausaufgaben ist). Sobald Sie es haben, fahren Sie mit dem nächsten Teil fort: Machen Sie die Berechnung, die Sie versucht haben zu tun.

Angenommen, Sie haben eine Reihe von Boxen haben, wie folgt aus:

Box[] boxes = { 
    new Box(40, 40), new Box(40, 40), new Box(80, 40), new Box(40, 40) 
}; 

(Ich kann nicht sagen, ob Sie ein Array oder eine Liste verwenden, so dass ich bin Kommissionierung nur ein zu demonstrieren.

)

Ich habe bereits den Algorithmus für die Anzahl der eindeutigen Elemente zu finden, so werde ich Ihnen zeigen, wie ich es schreiben würde:

List<Box> unique = new ArrayList<Box>(); 
for (Box box : boxes) { 
    if (!unique.contains(box)) { // this is why I implemented equals() and hashCode()! 
     unique.add(box); 
    } 
} 
int numOfDifferentShape = unique.size(); 

Das ist viel einfacher als Spur von zwei ints zu halten versuchen, für Jedes Objekt hat außerdem den Vorteil, dass Sie Ihre Array-Indizes nicht durcheinander bringen können.

Sie könnten dies noch einfacher mit einem Set. Es würde wie folgt aussehen:

Set<Box> boxSet = new HashSet<Box>(); 
for (Box b : boxes) 
    boxSet.add(b); 
int numOfDifferentShape = boxSet.size(); 

Beachten Sie, dass diese beiden letzten Schnipsel verwenden Funktionen aus Java 1.5, so dass ich weiß nicht, ob Sie in sie vor ausgeführt haben.

Macht das die Dinge klarer?

+0

lol ... tag du bist es (zumindest hast du diesmal die längere antwort!) – TofuBeer

+0

Ha, ich habe geschlagen! (Aber ich wette, ich habe vor dir begonnen.) –

+0

Ich bin mir sicher, dass du das getan hast – TofuBeer

1

Ich habe Array-Liste z. {40,40,80,20,40,40} Ich wollte die Elemente vergleichen. Eine gerade Zahl von Index (z. B. Index 0, Index 2, Index 4 usw.) repräsentiert die Höhe eines Objekts und eine ungerade Anzahl von Index (z. B. Index 1, Index 3 ec) repräsentiert die Breite eines Objekts. Also, mit dem obigen Code, Objekt 1 (Index 0 und 1).

Warum nicht ein Array von einer Dimension Klasse machen, so etwas wie dieses:

public class Dimension 
{ 
    private final int width; 
    private final int height; 

    public Dimension(final int w, 
        final int h) 
    { 
     width = w; 
     height = h; 
    } 

    public int getWidth() 
    { 
     return (width); 
    } 

    public int getHeight() 
    { 
     return (height); 
    } 
} 

dann eine for-Schleife etwas tun, wie folgt aus:

for(int i = 0; i < array.length; i += 2) 
{ 
    final Dimension a; 
    final Dimension b; 

    a = array[i]; 
    b = array[i + 1]; 

    // compare a.getLength() to b.getLength() 
    // or 
    // compare a.getWidth() to b.getWidth() 
} 

Es ist in der Regel eine schlechte Idee, Versuch und sei "tricky" - sagen, dass sogar diejenigen mit und ungerade sind, die Länge ist schwierig ... schlechte Idee IMO.

Verwandte Themen