2016-08-04 8 views
0

Dies ist ein kleiner Code, der, wenn die Länge des Eingangsarrays eine Potenz von zwei ist, die Größe des Segmentarrays 2 * (input_array.length) -1 else 2 * (nächste Potenz von 2 nach input_array .Länge) -1.Unerwarteter Kompilierungsfehler in Java

public static int ByLogs(int n) 
{ 
    double y = Math.floor(Math.log(n)/Math.log(2)); 
    return (int)Math.pow(2, y + 1); 
} 

public static void main(String [] args) 
{ 
    int input_array[] = {-1,2,4,0,3}; 

    if((input_array.length & (input_array.length - 1) == 0) && input_array.length > 0) 
     int [] segment_array = new int[2*(input_array.length)-1]; 
    else 
     int [] segment_array = new int[2*(ByLogs(input_array.length))-1]; 

    //Arrays.fill(segment_array,999); 

    System.out.println(segment_array.length); 
} 

aber nach der Kompilierung sind die folgenden Fehler aufgetreten.

SegmentTree.java:17: error: '.class' expected 
     int [] segment_array = new int[2*(input_array.length)-1]; 
      ^
SegmentTree.java:17: error: not a statement 
     int [] segment_array = new int[2*(input_array.length)-1]; 
      ^
SegmentTree.java:17: error: illegal start of expression 
     int [] segment_array = new int[2*(input_array.length)-1]; 
          ^
SegmentTree.java:17: error: ';' expected 
     int [] segment_array = new int[2*(input_array.length)-1]; 
          ^
SegmentTree.java:17: error: ']' expected 
     int [] segment_array = new int[2*(input_array.length)-1]; 
            ^
SegmentTree.java:17: error: not a statement 
     int [] segment_array = new int[2*(input_array.length)-1]; 
            ^
SegmentTree.java:17: error: illegal start of expression 
     int [] segment_array = new int[2*(input_array.length)-1]; 
             ^
SegmentTree.java:17: error: ';' expected 
     int [] segment_array = new int[2*(input_array.length)-1]; 
             ^
SegmentTree.java:17: error: not a statement 
     int [] segment_array = new int[2*(input_array.length)-1]; 
                ^
SegmentTree.java:17: error: ';' expected 
     int [] segment_array = new int[2*(input_array.length)-1]; 

Ich konnte meinen Fehler nicht finden.

+0

Im Grunde ist das Problem hier, außer Klammern ist, dass Sie Ihr Array innerhalb der if-Anweisungen initialisiert haben, aber das in der Druckanweisung nicht deklariert –

Antwort

1

In der if-Anweisung ist ein Fehler aufgetreten.

Siehe Kommentar:

public static int ByLogs(int n) 

{ 
    double y = Math.floor(Math.log(n)/Math.log(2)); 
    return (int)Math.pow(2, y + 1); 
} 

public static void main(String[] args) 
{ 
    int input_array[] = {-1,2,4,0,3}; 
    int [] segment_array; 
    int n = input_array.length; 

    //for positive n 
    if((n & (n - 1)) == 0) { 
     segment_array = new int[(2*(input_array.length))-1]; 
    } else { 
     segment_array = new int[(2*(ByLogs(input_array.length)))-1]; 
    } 

    //Arrays.fill(segment_array,999); 

    System.out.println(segment_array.length); 
} 
+1

Aber um zu überprüfen, Wetter n ist Macht von zwei haben wir überprüfen, ob if (n & n-1 == 0) oder nicht, dh wir müssen bitweise AND überprüfen. –

+0

'==' ist der Boolesche Operator, nicht die '&' –

+0

@ coder, mein Ausdruck ist algorithmisch korrekt, ich kann das nicht ändern wegen Kompilierungsfehler. Ich muss wissen, wo der Fehler aufgetreten ist. Bitweises AND ist die genaue Lösung für chenck, wenn eine Zahl die Potenz von zwei ist oder nicht –

3

First off, können Sie nicht wirklich eine Variable innerhalb einer if-Anweisung so erklären, da sie aus scope, sobald die Blockenden geht. Also statt:

if (...) { 
    int[] a = ...; 
} else { 
    int[] a = ...; 
} 

Sie wollen wahrscheinlich:

int[] a; // declare the variable first, *then* initialize it 
if (...) { 
    a = ...; 
} else { 
    a = ...; 
} 

Zweitens Ihre bedingt ist verstümmelt; die linke Seite der & ist eine int, aber die rechte Seite ist eine boolean. Der bitweise Operator unterstützt beide Typen, aber nicht zusammen. zu convert a boolean to an int können Sie dies explizit tun, z.

((input_array.length - 1) == 0) ? 1 : 0 

Um zu überprüfen, ob input_array.length is a power of two Sie wollen:

(input_array.length & (input_array.length - 1)) == 0 

Hinweis die extra close-paren nach -1.

Schließlich ist Ihre Syntax schlampig, was Ihren Code wahrscheinlich schwieriger macht. Obwohl Java Array-Deklarationen in vielen Formen erlaubt (z. B. int variable[], int [] variable,), wird nur die letzte allgemein verwendet. Ich würde dringend empfehlen, Ihre Arrays immer als type[] variableName zu deklarieren, auch wenn Sie es nicht müssen. Verwenden Sie ebenfalls immer { }, wenn Sie Blöcke schreiben (if, else, for, usw.), da dies Ihren Code in Zukunft leichter zu lesen und sicherer zu modifizieren macht.

+0

Code läuft gut mit einem Leerzeichen 'int []', übrigens. Überrascht hast du nicht auf 'int input_array [] 'hingewiesen, obwohl das auch korrekt ist –

+0

@ cricket_007 oh komisch, es war nicht für mich vorher kompilieren, aber das war eindeutig eines der anderen Probleme manifestiert sich seltsam. Danke, ich repariere meine Antwort! – dimo414

+0

Ja, ich habe das Problem herausgefunden und danke, dass Sie mir geholfen haben.Ich muss zuerst das Array initialisieren und dann in der If-else-Anweisung den Speicherplatz zuweisen. Aber könnten Sie erklären, warum? –