ΤάνιαΓ. Δημοσ. 21 Νοεμβρίου 2014 Δημοσ. 21 Νοεμβρίου 2014 Έχω γράψει αυτήν την κλάση η οποία διαβάζει ένα text με προσφορές που σε κάθε του γραμμή έχει μία προσφορά η οποία περιλαμβάνει StoreName, ProductCategory, ProductName, ProductPrice, ProductDescription.. Μετά πρέπει να το χωρίζει σε λέξεις και να τις αποθηκεύει σε έναν πίνακα και τέλος μέσα στην ReadOffer να δίνει τιμές σε καθένα από τα παραπάνω και να τα αποθηκεύει στο αντικείμενο offers το οποίο και θα επιστρέφει.. Αλλά δεν μου τρέχει σωστά.. Μπορείτε να προτείνετε κάτι..? package com.example.crazysellout.UserSide; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import com.example.crazysellout.Offer; //Class that, reads the file of the data. public class OfferDataReader { String[] fileOnTable; Offer ReadOffer(int indexLine){ Offer offers = new Offer(); offers.StoreName = fileOnTable[0]; offers.ProductCategory = fileOnTable[2]; offers.ProductName = fileOnTable[3]; offers.ProductPrice = fileOnTable[4]; offers.ProductDescription = fileOnTable[5]; return offers; } //initialize txt reader with the input stream to set fileOnTable public OfferDataReader(InputStream iStream) throws IOException { super(); this.readDataFile(iStream); } //Method that reads the text file from resources and public void readDataFile(InputStream iStream) throws IOException { //String that gets each line of the text file in a while loop String stringContainer = null; String strW= null; //Variable in which the contex of the file will be stored StringBuffer strBuffer = new StringBuffer(); //Reads each line from the file. BufferedReader reader = new BufferedReader(new InputStreamReader(iStream)); while ((stringContainer = reader.readLine()) != null) { strBuffer.append(stringContainer + "\n"); } while ((strW = reader.readLine()) != null) { strBuffer.append(strW + " "); } } //Method that separates the string buffer to lines, and saves //on a table so that they can be identified as an account. public void textIndexOnTable(String indexOnString){ fileOnTable = indexOnString.split("\r\n|\r|\n"); } public void lineInWords(String indexOnString){ fileOnTable = indexOnString.split(" "); } }
Moderators Kercyn Δημοσ. 21 Νοεμβρίου 2014 Moderators Δημοσ. 21 Νοεμβρίου 2014 Υποθέτω ότι τα attributes της Offer είναι public, αλλιώς αυτά που γράφεις στο ReadOffer θα σου χτυπήσουν. Επίσης, στην ίδια μέθοδο πας από το fileOnTable[0] στο fileOnTable[2]. Αμφιβάλλω αν είναι αυτό που θες, και αν έχω δίκιο θα βγεις εκτός range του fileOnTable με το fileOnTable[5] (υποθέτωντας, πάλι, ότι έχει μέγεθος 5). Τέλος, έχεις ένα indexLine που δε χρησιμοποιείς πουθενά. Στον constructor έχεις ένα super, χωρίς η κλάση να κάνει extend τίποτα. Τέλος, δε βλέπω πουθενά να καλείς τις 2 τελευταίες μεθόδους (ίσως τις καλείς αλλού) και δεν ελέγχεις το μέγεθος του fileOnTable πριν κάνεις τις προσπελάσεις σου. Θα βοηθούσε, επίσης, αν μας έγραφες και τι λάθος σου βγάζει ο compiler ή πού σου χτυπάει. Το "δε μου τρέχει σωστά" δεν είναι ιδιαίτερα διαφωτιστικό.
ΤάνιαΓ. Δημοσ. 21 Νοεμβρίου 2014 Μέλος Δημοσ. 21 Νοεμβρίου 2014 Ευχαριστώ που μου απάντησες..! Δεν βγάζει λάθος ο compliler απλά όταν παίρνει αυτά τα δεδομένα η κλάση που είναι να τα τυπώσει δεν εμφανίζει αποτελέσματα..! Απ'ότι κατάλαβα, γιατί είμαι νέα στην java μου λες ότι έχω αποθηκεύσει λάθος τις τιμές μου.. Πως να το κάνω για να αποθηκευτεί σωστά..?
Moderators Kercyn Δημοσ. 21 Νοεμβρίου 2014 Moderators Δημοσ. 21 Νοεμβρίου 2014 Μπορείς να βάλεις όλον τον κώδικα;
ΤάνιαΓ. Δημοσ. 21 Νοεμβρίου 2014 Μέλος Δημοσ. 21 Νοεμβρίου 2014 Είναι πολύ μεγάλο project για να το ανεβάσω όλο.. :/ Αν βοηθάει μπορώ να σου πω ότι το index Line δεν χρησιμοποιείται πουθενά και προφανώς έκανα λάθος.. Ότι δεν ξέρω καθόλου πως να δηλώσω τα attributes και να επιστρέψω το offers γι'αυτό και το λάθος με τον πίνακα και το super Που έχω βάλει είναι γιατί μου το έβγαζε σαν διόρθωση το eclipse.. Εγώ απλά προσπαθούσα να κάνω αυτό που έγραψα στο Post.. Αλλά μάλλον λανθασμένα..
tr3quart1sta Δημοσ. 21 Νοεμβρίου 2014 Δημοσ. 21 Νοεμβρίου 2014 Στον constructor έχεις ένα super, χωρίς η κλάση να κάνει extend τίποτα. extends Object
Moderators Kercyn Δημοσ. 21 Νοεμβρίου 2014 Moderators Δημοσ. 21 Νοεμβρίου 2014 extends Object Έχεις δίκιο, ξέχασα το "m-muh objects" της Java... Τάνια, μπορείς να βάλεις τουλάχιστον την Offer και εκεί απ' όπου καλείς τις συναρτήσεις σου για να κάνεις αυτό που θες (ίσως τη main);
ΤάνιαΓ. Δημοσ. 21 Νοεμβρίου 2014 Μέλος Δημοσ. 21 Νοεμβρίου 2014 package com.example.crazysellout; public class Offer { //This is a struct of data that represents an offer. public String StoreName; public String ProductCategory; public String ProductName; public String ProductPrice; public String ProductDescription; } H Offer είναι αυτή.. Οι συναρτήσεις μου δεν καλούνται κάπου.. Αυτά που σας έγραψα πρέπει να τα κάνω εδώ.. Και το offers που επιστρέφεται το χρησιμοποιεί άλλη κλάση.. Πολύ χάλια τα έκανα ε..?!
Moderators Kercyn Δημοσ. 21 Νοεμβρίου 2014 Moderators Δημοσ. 21 Νοεμβρίου 2014 (επεξεργασμένο) Δες αυτές τις γραμμές while ((stringContainer = reader.readLine()) != null) { strBuffer.append(stringContainer + "\n"); } while ((strW = reader.readLine()) != null) { strBuffer.append(strW + " "); } Αρχικά διαβάζεις από το reader μέχρι να τελειώσει, και μετά επιχειρείς να διαβάσεις πάλι από το reader (αφού έχει τελειώσει). Το strW θα είναι πάντα άδειο. Μία ιδέα για το πώς μπορείς να το υλοποιήσεις: Διαβάζεις από το reader μία μία γραμμή, αποθηκεύοντας τη σε έναν πίνακα από Strings (αυτό που κάνεις τώρα είναι να την προσθέτεις σε ένα String βάζοντας ένα \n στο τέλος). Διατρέχεις τον πίνακα με τις γραμμές και καλείς την lineInWords για το κάθε στοιχείο του. Για το ίδιο στοιχείο, καλείς και την ReadOffer και αποθηκεύεις το επιστρεφόμενο Offer σε μια μεταβλητή. Υλοποιείς μια καινούρια μέθοδο, έστω print, στην κλάση Offer, όπου δουλειά της θα είναι να εκτυπώνει τα στοιχεία του Offer object. Τρέχεις την print για κάθε Offer που δημιούργησες στο βήμα 3. Παράδειγμα κώδικα (δεν το έχω τρέξει, δεν το έχω κάνει compile) // Μέθοδος της κλάσης Offer public void printOffer() { System.out.println(StoreName + " " + ProductCategory + " " + ProductName + " " + ProductPrice + " " + ProductDescription); } public void readDataFile(String path) throws IOException { ArrayList<String> lines = new ArrayList<String>(); Scanner s = new Scanner(new File(path)); while (s.hasNext()) { lines.add(s.next()); } s.close(); for (String l : lines) { lineInWords(l); Offer offer = ReadOffer(); offer.print(); } } Το ArrayList είναι μία κλάση που υλοποιεί μια λίστα. Σκέψου το σαν μια λίστα που μπορεί να αλλάζει μέγεθος (να βάζεις και να βγάζεις στοιχεία ελεύθερα). Στο while διαβάζουμε από το αρχείο και βάζουμε κάθε γραμμή στη λίστα μας. Η for αυτή λέγεται range-based for ή foreach loop. Αυτό που κάνει είναι να διατρέχει τη λίστα με τις γραμμές (lines) και σε κάθε επανάληψη να βάζει μία γραμμή στη μεταβλητή l. Θα μπορούσαμε να το πούμε "πάρε κάθε String στη λίστα με τα Strings και κάνε αυτό...). Εδώ σπάμε την κάθε γραμμή με το lineInWords, δημιουργούμε ένα Offer και το εκτυπώνουμε (η fileOnTable έχει πάρει τις τιμές που χρειάζεται μετά την κλήση της lineInWords. Επεξ/σία 21 Νοεμβρίου 2014 από Kercyn
ΤάνιαΓ. Δημοσ. 21 Νοεμβρίου 2014 Μέλος Δημοσ. 21 Νοεμβρίου 2014 Το lineInWords που θα το γράψω και που θα το καλέσω..? Το fileOnTable μου λέει να το κάνω μέθοδο..!
Moderators Kercyn Δημοσ. 21 Νοεμβρίου 2014 Moderators Δημοσ. 21 Νοεμβρίου 2014 Το fileOnTable είναι typo. lineInWords έπρεπε να γράψω εκεί.
ΤάνιαΓ. Δημοσ. 22 Νοεμβρίου 2014 Μέλος Δημοσ. 22 Νοεμβρίου 2014 Σε ευχαριστώ που με βοήθησες..! Να'σαι καλά..!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα