ALLisCHAOS Δημοσ. 17 Μαΐου 2013 Δημοσ. 17 Μαΐου 2013 γεια σας...δουλευω πάνω σε μια εργασία αλλά έχω κολλήσει με ένα error.. το οποιο ειναι: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 και θα ήθελα λίγο τα "φώτα" σας αν μπορειτε...ολο το προβλημμα είναι σε αυτή τη μέθοδο : (στο κυρίως προγραμμα καλείται με τη sort οπότε ξεκινηστε να διαβάζετε απο κάτω προς τα πάνω ) public static void swap2(Book pinakas[],int x,int y) { int temp=pinakas[x].getEtos(); pinakas[x].setEtos(pinakas[y].getEtos()); pinakas[y].setEtos(temp); } public static int partition2(Book pinakas[],int f,int l) { int ret_value; int lowerLimit=f; int mid=(f+l)/2; swap2(pinakas,f,mid); int pivot=pinakas[f].getEtos(); f++; while(f<l) { while(pinakas[f].getEtos()<=pivot && f<l) f++; while(pinakas[l].getEtos()>=pivot && f<=l) l--; if(f<l) swap2(pinakas,f,l); } if(pivot>(pinakas[f].getEtos())) { swap2(pinakas,f,lowerLimit); ret_value=f; } else { if(pivot>=(pinakas[l].getEtos())) swap2(pinakas,l,lowerLimit); ret_value=l; }return ret_value; } public static void quickSort2(Book pinakas[],int f,int l) { int pivot_index=partition2(pinakas,f,l); quickSort2(pinakas,f,pivot_index-1); quickSort2(pinakas,pivot_index+1,l); } public static void sort2(Book pinakas[]) { int metrhths=0; for(int i=0;i<pinakas.length;i++){ if(pinakas!=null) metrhths++; } quickSort2(pinakas,0,metrhths-1); } στη ουσία είναι η quick sort (γρηγορη ταξινομηση)
παπι Δημοσ. 17 Μαΐου 2013 Δημοσ. 17 Μαΐου 2013 Βαλε breakpoint και πηγαινε step by step για να δεις που γινεται το pinakas[-1]
temp_ Δημοσ. 18 Μαΐου 2013 Δημοσ. 18 Μαΐου 2013 Υπάρχει στον editor του φόρουμ ειδικό κουμπί για παράθεση κώδικα (το <>) ώστε να μπορούμε να τον διαβάζουμε άνετα (αν και έχει αρκετά προβλήματα). Οπότε ο κώδικας που παρέθεσες γίνεται κάπως έτσι... public static void swap2( Book pinakas[], int x, int y ) { int temp = pinakas[x].getEtos(); pinakas[x].setEtos( pinakas[y].getEtos() ); pinakas[y].setEtos( temp ); } public static int partition2( Book pinakas[], int f, int l ) { int ret_value; int lowerLimit = f; int mid = (f+l)/2; swap2( pinakas, f, mid ); int pivot = pinakas[f].getEtos(); f++; while ( f < l ) { while ( pinakas[f].getEtos() <= pivot && f < l) f++; while ( pinakas[l].getEtos() >= pivot && f <= l) l--; if (f < l) swap2( pinakas, f, l ); } if ( pivot > (pinakas[f].getEtos()) ) { swap2( pinakas, f, lowerLimit ); ret_value = f; } else { if ( pivot >= (pinakas[l].getEtos()) ) swap2(pinakas,l,lowerLimit); ret_value = l; } return ret_value; } public static void quickSort2( Book pinakas[], int f, int l ) { int pivot_index = partition2( pinakas, f, l ); quickSort2( pinakas, f, pivot_index-1 ); quickSort2( pinakas, pivot_index+1, l ); } public static void sort2( Book pinakas[] ) { int metrhths = 0; for (int i=0; i < pinakas.length; i++) { if ( pinakas[i] != null ) metrhths++; } quickSort2( pinakas, 0, metrhths-1 ); } Από ότι κατάλαβα, πήρες την υλοποίηση της τάξης CS321 του University of Cincinnati και προσπάθησες να τον προσαρμόσεις στο δικό σου πρόγραμμα. Ένα σημείο που δεν ξέρω αν το πρόσεξες είναι πως ο αλγόριθμος που δίνει το Πανεπιστήμιο του Σινσνάτι ΔΕΝ λειτουργεί όταν μέσα στον πίνακα υπάρχουν ίδια νούμερα. Πρέπει να είναι όλα μοναδικά, αλλιώς βγάζει μήνυμα λάθους και σταματάει. Τον δοκίμασα και εγώ και λειτουργεί έτσι ακριβώς. Τον άλλαξα λιγάκι ώστε αντί να του δίνω τους ακέραιους στη γραμμή εντολών, τους έχω ενσωματώσει μέσα στο πρόγραμμα... import java.io.*; import java.util.*; import java.util.Scanner; /* Implemented in the CS321 class, at the University of Cincinnati (http://gauss.ececs.uc.edu/Courses/C321/html/qsort.java.html) NOTE: All integers MUST be distinct! */ public class QSort { public static void main(String argv[]) { Scanner input = new Scanner(System.in); // NOTE: All integers must be distinct int[] arr = {100, 12, 6, 54, 89, 32, 0, 1, -10, 102}; qsort(arr, 0, arr.length-1); for (int i=0; i < arr.length; i++) System.out.print(arr[i] + " "); System.out.println(); System.out.print( "\npress ENTER..." ); input.nextLine(); } public static void swap (int A[], int x, int y) { int temp = A[x]; A[x] = A[y]; A[y] = temp; } // Reorganizes the given list so all elements less than the first are // before it and all greater elements are after it. public static int partition(int A[], int f, int l) { int pivot = A[f]; while (f < l) { if (A[f] == pivot || A[l] == pivot) { System.out.println("Only distinct integers allowed - C321"); System.out.println("students should ignore this if statement"); System.exit(0); } while (A[f] < pivot) f++; while (A[l] > pivot) l--; swap (A, f, l); } return f; } public static void qsort(int A[], int f, int l) { if (f >= l) return; int pivot_index = partition(A, f, l); qsort(A, f, pivot_index); qsort(A, pivot_index+1, l); } } Έξοδος: -10 0 1 6 12 32 54 89 100 102 press ENTER... Πειράζοντας τώρα τον κώδικα που παρέθεσες ώστε να δουλεύει με απλούς ακεραίους αντί για Books, έγραψα το παρακάτω... import java.util.Scanner; public class QsortInsomnia { public static void main( String[] args ) { Scanner input = new Scanner(System.in); int[] pinakas = {100, 12, 6, 54, 89, 32, 0, 1, -10, 102}; print_arr( pinakas ); sort2( pinakas ); print_arr( pinakas ); System.out.print( "\npress ENTER..." ); input.nextLine(); } static void print_arr( int[] pinakas ) { for (int i=0; i < pinakas.length; i++) { System.out.print( pinakas[i] + " " ); } System.out.println(); } public static void swap2( int pinakas[], int x, int y ) { int temp = pinakas[x]; pinakas[x] = pinakas[y]; pinakas[y] = temp; } public static int partition2( int pinakas[], int f, int l ) { int ret_value; int lowerLimit = f; int mid = (f+l)/2; swap2( pinakas, f, mid ); int pivot = pinakas[f]; f++; while ( f < l ) { while ( pinakas[f] <= pivot && f < l) f++; while ( pinakas[l] >= pivot && f <= l) l--; if (f < l) swap2( pinakas, f, l ); } if ( pivot > pinakas[f] ) { swap2( pinakas, f, lowerLimit ); ret_value = f; } else { if ( pivot >= pinakas[l] ) swap2(pinakas, l, lowerLimit); ret_value = l; } return ret_value; } public static void quickSort2( int pinakas[], int f, int l ) { int pivot_index = partition2( pinakas, f, l ); quickSort2( pinakas, f, pivot_index-1 ); quickSort2( pinakas, pivot_index+1, l ); } public static void sort2( int pinakas[] ) { /* int metrhths = 0; for (int i=0; i < pinakas.length; i++) { if ( pinakas[i] != null ) metrhths++; } */ quickSort2( pinakas, 0, pinakas.length-1 ); } } Δεν μπήκα στην διαδικασία να κάτσω να τα συγκρίνω, αλλά στα παραθέτω σε αυτό το νήμα και τα δυο με πίνακες ακεραίων, ώστε να το κάνεις εσύ Ο jdb πάντως στον δικό σου κώδικα (τον αλλαγμένο για πίνακες ακεραίων) βαράει ArrayOutOfBounds exception στην γραμμή 61 (στην συνάρτηση: partition2() ): > jdb QsortInsomnia Initializing jdb ... > run run QsortInsomnia Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable > VM Started: 100 12 6 54 89 32 0 1 -10 102 Exception occurred: java.lang.ArrayIndexOutOfBoundsException (uncaught)"thread=m ain", QsortInsomnia.partition2(), line=61 bci=106 61 if ( pivot >= pinakas[l] ) Σημείωσε επίσης πως έχω βάλει σε σχόλιο τον έλεγχο που κάνεις στην συνάρτηση sort2() αφού οι ακέραιες τιμές δεν μπορούν να συγκριθούν με null.
ALLisCHAOS Δημοσ. 18 Μαΐου 2013 Μέλος Δημοσ. 18 Μαΐου 2013 wow!! σε ευχαριστω και μόνο που έκατσες κ ασχοληθηκες τόσο με τον κώδικο ...νομίζω πως παραλίγο θα ερχόσουν κ σπίτι μου να το κάνεις ... θα καθήσω να τα τσεκάρω αν είναι κ ενημερώνω...σχετικά με το αν υπάρχουν ιδιοι αριθμοι μέσα στο πινακα (που πεταει error) οχι δεν το είχα προσέξει αλλά δεν νομίζω να είναι εκεί το προβλήμα καθως στι δοκιμες δεν εδινα ίδιους αριθμους...thnk u again
temp_ Δημοσ. 18 Μαΐου 2013 Δημοσ. 18 Μαΐου 2013 Χεχε.. πάντως δεν έγραψα πολύ κώδικα, αντιγραφή & επικόλληση ήταν ο περισσότερος.
ALLisCHAOS Δημοσ. 22 Μαΐου 2013 Μέλος Δημοσ. 22 Μαΐου 2013 λοιπόνν επανήλθα..εστω και μετά απο κάποιες μέρες ... μετέτρεψα ακριβως τον κωδικα του πανεπιστημίου στον αντίστοιχο που είχα κάνει αλλά πετούσε error... λοιπόν όμως εξακολουθεί να πετάει το συγκεκριμένο error... μηπως κάτι πάει λάθος εκεί στο τέλος που έχω το μετρητή(που βλέπει πόσοι πίνακες δεν είναι αδειοι)??
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα