Προς το περιεχόμενο

Java Ταξινόμηση με φυσαλίδα ΠΡΟΒΛΗΜΑ!!


Tsarkamparararam

Προτεινόμενες αναρτήσεις

Δημοσ.

Λοιπόν έχω ένα πρόβλημα στη Java εδώ και κάτι ώρες και έχω σπάσει το κεφάλι μου να βρώ τη λύση αλλά δεν.... Λοιπόν έχω να ταξινομήσω ένα πίνακα με βάση το έτος εισαγωγής ενός φοιτητής και ενώ το πρόγραμμα τρέχει μου βγάζει πρόβλημα στη μεταγλώτιση... Λοιπόν ο κώδικας είναι ο :

 

import java.io.*;

class UserInput { //Class gia eisagogi dedomenwn apo to pliktrologio

public static String getString() { //Methodos gia eisagogi String

 

String line;

InputStreamReader input=new InputStreamReader(System.in);

BufferedReader in=new BufferedReader(input);

try {

line=in.readLine();

return line;

}

catch(Exception e) {

return "Exception";

}

}

public static short getShort() { // Methodos gia eisagogi short

 

String line;

InputStreamReader input=new InputStreamReader(System.in);

BufferedReader in=new BufferedReader(input);

try {

line=in.readLine();

short i=Short.parseShort(line);

return i;

}

catch(Exception e){

return -1;

}

}

}

 

class Foititis{

private String name, surname;

private short am, etos;

 

Foititis(String n, String s, short a, short e){

name=n;

surname=s;

am=a;

etos=e;

}

 

public String getSurname(){

return surname;

}

 

public short getAM(){

return am;

}

 

public void setEtos(short e){

etos=e;

}

public short getEtos(){

return etos;

}

 

 

 

}

 

class MyUtils{

public static void bubbleSortEE(Foititis pin[]){

boolean flag=true;

int temp;

for(int i=1;i<pin.length;i++){

flag=true;

for(int j=0;j<pin.length-i;j++){

if(pin[j].getEtos()<pin[j+1].getEtos()){

temp=pin[j].getEtos();

pin[j].setEtos(pin[j+1].getEtos());

pin[j+1].setEtos(pin[j].getEtos());

flag=false;

}

}

if(flag) return;

}

 

 

}

 

 

}

 

class Lab2Ask2{

public static void main(String[] args){

Foititis pin[]=new Foititis[5];

 

for(int i=0;i<pin.length;i++){

System.out.println("Dwste onoma.");

String name=UserInput.getString();

System.out.println("Dwste epitheto.");

String surname=UserInput.getString();

System.out.println("Dwste Ar. Mitrwoy.");

short am=UserInput.getShort();

System.out.println("Dwste etos eisagwgis.");

short etos=UserInput.getShort();

pin=new Foititis(name, surname, am, etos);

}

 

System.out.println("Ta3inomisi toy pinaka twn foititwn me basi to etos eisagwgis.");

MyUtils.bubbleSortEE(pin);

for(int i=0;i<pin.length;i++){

System.out.println(pin);}

 

}

}

 

 

Και ενώ το πρόγραμμα τρέχει κανονικά και μεταφράζεται κανονικά και βγάζει πρόβλημα στη μεταγλώτιση καθώς δεν έχω σωστά τα αποτελέσματα... Δηλαδή ταξινομημένα.... Ξέρει κανείς τι παίζει????? :/

Δημοσ.
class MyUtils{

public static void bubbleSortEE(Foititis pin[]){

boolean flag=true;

int temp;

for(int i=1;i<pin.length;i++){

flag=true;

for(int j=0;j<pin.length-i;j++){

if(pin[j].getEtos()<pin[j+1].getEtos()){

temp=pin[j].getEtos();

pin[j].setEtos(pin[j+1].getEtos());

pin[j+1].setEtos(pin[j].getEtos());

flag=false;

}

}

if(flag) return;

}

}

}

 

>temp=pin[j].getEtos();
pin[j].setEtos(pin[j+1].getEtos());
pin[j+1].setEtos(temp);

Μην ξεχνάς ότι έβαλες την αρχική τιμή του pin[j] στο temp ;)

 

PS. Όλο αυτό με το flag που χρειάζεται; Επίσης δεν χρειάζεται return είναι void η μέθοδός σου.

Δημοσ.

Aυτό με την αρχική τιμή δεν το κατάλαβα.... :/

Το flag το θέλω για να ξέρω πότε είναι ταξινομημένος ο πίνακας..... δηλαδή όταν μου επιστρέφει το flag true πάει να πέι ότι δεν μπήκε μέσα στην συνθήκη για να πάρει την τιμή false και συνεπώς δεν ισχύει η συνθήκη if, πράγμα που πάει να πεί ότι ο πίνακας είναι ταξινομημένος και δεν χρειάζεται να ξοδέψω άδικα και άλλη μνήμη για να ελέγξω τον πίνακα αν είναι ταξινομημένος ή όχι....

Δημοσ.

Στην ουσία θέλεις να κάνεις αντιμετάθεση δύο τιμών με την χρήση μίας τρίτης σαν temp. Ας υποθέσουμε ότι έχουμε τις μεταβλητές n1 = 1,n2 = 2,temp.

 

Πρέπει να κάνεις:

temp = n1; //άρα το temp = 1 τώρα

n1 = n2; //άρα το n1 = 2 τώρα

n2 = temp; //άρα το n2 = 1 τώρα

Οπότε οι τελικές τιμές είναι n1=2 και n2=1.

 

Εσύ έχεις γράψει:

temp = n1; //άρα το temp = 1 τώρα

n1 = n2; //άρα το n1 = 2 τώρα

n2 = n1; //το n1 έχει ήδη αλλάξει τιμή οπότε το n2 παίρνει την τιμή του που είναι 2.

Οπότε οι τελικές τιμές είναι n1=2 και n2=2. Έχεις αποθηκεύσει την αρχική τιμή του n1 στο temp.

 

Ok κατάλαβα την λογική του flag απλά γράψε if(flag) brake; που απλά θα βγει από το loop. Μπορεί να θέλεις να γράψεις κάτι άλλο μετά το loop και γενικά το return χρησιμοποιείται για να επιτρέψει κάποια τιμή.

 

PS. Εννοώ ότι στην συγκεκριμένη περίπτωση δεν χρειάζεται και τόσο το return, υπάρχουν περιπτώσεις με if-else και λοιπά που μπορεί να χρειαστεί για έξοδο της μεθόδου σε διάφορα σημεία του κώδικα...

Δημοσ.

Μπορεί να γίνει και χωρίς break; , γιατί έτσι είναι κανονικά ο default αλγόριθμος... με return δηλαδή,απλά δεν νομίζω να επηρρεάζει αυτό..... Κάποια χαζομάρα με τις μεταβλητές παίζει,αλλά δεν τη βρίσκω..... Τέσπα.... τον παρατάω.... αρκετή ώρα απο τη ζωή μου έχει φάει αυτό το πρόγραμμα!!!! ^^

Δημοσ.

στην κλάση σου Foititis

πρόσθεσε την πιο κάτω μέθοδο

 

>
.....
@Override
public String toString(){
return "name="+name+" surname="+surname+" am="+am+" etos="+etos;
}
......

 

στην MyUtils αλλαξε την μέθοδο ταξινόμησης ως εξής

>
public static void bubbleSortEE(Foititis pin[]){
//boolean flag=true;
Foititis temp;
for(int i=1;i<pin.length;i++){
	//flag=true;
	for(int j=0;j<pin.length-i;j++){
		if(pin[j].getEtos()>pin[j+1].getEtos()){
		temp=pin[j];//<-------στα αντικείμενα δεν αλλάζεις τις ιδιότητες μεταξύ τους 
                                  //αλλά την θέση των αντικειμένων στον πίνακα που βρίσκονται
		pin[j]=pin[j+1];
		pin[j+1]=temp;
		//flag=false;
	}
}
//if(flag) 
	//return;
}

 

και είσαι έτοιμος.

Δημοσ.

Ναιιιιι...... Δουλεύειιιι!!!!!! Τελειαααααα.... Να σε πώ τώρα ρε φίλε.... Καταρχάς σε ευχαριστώ.... Ουσιαστικά εμείς δεν έπρεπε να ταξινομήσουμε με βάση το έτος εισαγωγής τον πίνακα,αλλά να αναδιοργανώσουμε όλα τα αντικείμενα με βάση το έτος εισαγωγής άμα κατάλαβα καλά.... Σωστά?????

Δημοσ.

.........Ουσιαστικά εμείς δεν έπρεπε να ταξινομήσουμε με βάση το έτος εισαγωγής τον πίνακα,αλλά να αναδιοργανώσουμε όλα τα αντικείμενα με βάση το έτος εισαγωγής άμα κατάλαβα καλά.... Σωστά?????

 

 

σωστά.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...