Evangeli Δημοσ. 27 Ιουλίου 2009 Δημοσ. 27 Ιουλίου 2009 Καλησπέρα Ψάχνω έναν αποδοτικό τρόπο να ταξινομήσω έναν πολύ μεγάλο πίνακα της τάξης των δεκάδων χιλιάδων γραμμών. Δοκίμασα τον quick sort. Δεν μου έτρεξε με την πρώτη και δεν πιστεύω ως θα παίξει τελικά... Έχετε να προτείνετε κάτι? Ο πίνακας μου είναι τύπου Object[][] δυο στήλες με πολύ μεγάλο αριθμό γραμμών όπως είπα και πριν. Λεω να δοκιμάσω το παρακάτω, τι λετε? > String[] array = new String[]{}; Map<String, Integer> map = new TreeMap<String, Integer>(); for (int i = 0; i < array.length; ++i) { map.put(array[i], i); } Collection<Integer> indices = map.values(); Βαγγέλης.
Cue Δημοσ. 27 Ιουλίου 2009 Δημοσ. 27 Ιουλίου 2009 Ρίξε μια ματιά Collections Algorithms και Collection#sort Τα data από που τα διαβάζεις? (database, file, over the network, etc) Αν όντως είναι "τόσα πολλά" τότε ίσως χρειαστεί να χρησιμοποιήσεις threads με κάθε thread να κάνει ξεχωριστά το sorting. Ενδεικτικά δες το άρθρο περί ParallelArray (unreleased Java 7)
virxen75 Δημοσ. 28 Ιουλίου 2009 Δημοσ. 28 Ιουλίου 2009 η ταξινόμηση θα είναι μία και έξω? ή θα γίνεται σε κάθε εκτέλεση του προγράμματος? τα δεδομένα από που προκύπτουν? που φυλάσονται?
Evangeli Δημοσ. 28 Ιουλίου 2009 Μέλος Δημοσ. 28 Ιουλίου 2009 Τα δεδομένα βρίσκονται τόσο σε αρχείο όσο και σε πίνακα. Η δομή του πίνακα είναι όπως προανέφερα. Αργότερα θα ρίξω μια ματιά στα links του Cue και θα σας πω. Δεν με νοιάζει η ταχύτητα του αλγορίθμου, απλά θέλω να μπορεί να χειριστεί μεγάλο όγκο δεδομένων... Βαγγέλης.
virxen75 Δημοσ. 28 Ιουλίου 2009 Δημοσ. 28 Ιουλίου 2009 δεν μου απάντησες αν θες η ταξινόμηση να γίνει μία φορά και να αποθηκευτούν ταξινομημένα σε αρχείο τα δεδομένα σου έτσι όταν θα χρειαστείς αργότερα να προσθέσεις κάτι το βάζεις απευθείας στην σωστή θέση ταξινομημένο δηλαδή στο αρχείο και πάλι ώστε να γλιτώσεις χρόνο.
Evangeli Δημοσ. 28 Ιουλίου 2009 Μέλος Δημοσ. 28 Ιουλίου 2009 δεν μου απάντησες αν θες η ταξινόμηση να γίνει μία φοράκαι να αποθηκευτούν ταξινομημένα σε αρχείο τα δεδομένα σου έτσι όταν θα χρειαστείς αργότερα να προσθέσεις κάτι το βάζεις απευθείας στην σωστή θέση ταξινομημένο δηλαδή στο αρχείο και πάλι ώστε να γλιτώσεις χρόνο. Ναι. Μια φορά θα κάνουμε ταξινόμηση. Μετά, την αποθήκευση στο αρχείο ξέρω πως να την κάνω. Δεν σκοπεύω να προσθέτω και να αφερώ δεδομένα.
virxen75 Δημοσ. 29 Ιουλίου 2009 Δημοσ. 29 Ιουλίου 2009 ωραία ο πίνακας σου είναι είπες 2 διαστάσεων τι δεδομένα έχει η κάθε στήλη του και με βάση πιο κριτήριο θέλεις την ταξινόμηση? στείλε έναν εικονικό πίνακα 5 θέσεων με τα περιεχόμενα πριν την ταξινόμηση και πως τα θες μετά την ταξινόμηση για να καταλάβω τι ακριβώς θες και θα σου στείλω τον κώδικα που θες
Evangeli Δημοσ. 29 Ιουλίου 2009 Μέλος Δημοσ. 29 Ιουλίου 2009 ωραία ο πίνακας σου είναι είπες 2 διαστάσεων τι δεδομένα έχει η κάθε στήλη του και με βάση πιο κριτήριο θέλεις την ταξινόμηση? στείλε έναν εικονικό πίνακα 5 θέσεων με τα περιεχόμενα πριν την ταξινόμηση και πως τα θες μετά την ταξινόμηση για να καταλάβω τι ακριβώς θες και θα σου στείλω τον κώδικα που θες Καλησπέρα, Ο πίνακας μου είναι τύπου Object. Πρώτη στήλη περέχει strings ενώ η δεύτερη integers. Ποιό συγκεκριμένα: > // The first column of the above array contains words in descending // order, while the second one contens theres occurences! Object[][] wordOccurrencesArray = new Object[numOfUniqueWords][2]; Η αρχικοποίηση του γίνετε ώς εξής: > while ((strLine = br.readLine()) != null) { // Print the content on the console // System.out.println(strLine); wordOccurrencesArray[i][0] = new String(strLine); wordOccurrencesArray[i][1] = new Integer(0); } Αύξηση του μετρητή: > wordOccurrencesArray[j][1] = ((Integer)wordOccurrencesArray[j][1]).intValue() + 1; Τώρα, υποθέτοντας οτι ο πίνακας μου έχει την εξής μορφή: Blockbuster 2 Iris 3 IRELAND 2 helps 24 snagging 1 3pxborder1px 4 asArea 1 ADDTHIS 4 long-standing 6 manufacturing 8 single 17 Εγώ θέλω να πέρνω την ταξινόμηση αυτου με βάση την 2η στήλη, δηλαδή: helps 24 single 17 manufacturing 8 long-standing 6 ADDTHIS 4 3pxborder1px 4 Iris 3 Blockbuster 2 IRELAND 2 snagging 1 asArea 1
Evgenios1 Δημοσ. 29 Ιουλίου 2009 Δημοσ. 29 Ιουλίου 2009 Πρωταση: Κανε μια κλαση η οποια θα εχει ενα object και ενα int >class SomeObject { public object Obj; public int ObjInt; } βαλτης και του operators <,>,==,!= με κριτηριο το ObjInt.
Evangeli Δημοσ. 29 Ιουλίου 2009 Μέλος Δημοσ. 29 Ιουλίου 2009 Πρωταση:Κανε μια κλαση η οποια θα εχει ενα object και ενα int >class SomeObject { public object Obj; public int ObjInt; } βαλτης και του operators <,>,==,!= με κριτηριο το ObjInt. Thanks Evgenios1 για την απάντηση. Αλλα βασικά δεν κατάλαβα πως θα το χρεισιμοποιήσω! Εγώ αναζήτηση θέλω να κάνω!
virxen75 Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 δες αυτό SortArray.java > import java.util.*; public class SortArray{ public SortArray(){ Object[][] wordOccurrencesArray = new Object[11][2]; Object temp1,temp2; wordOccurrencesArray[0][0]=new String("Blockbuster"); wordOccurrencesArray[0][1]=new Integer(2); wordOccurrencesArray[1][0]=new String("Iris"); wordOccurrencesArray[1][1]=new Integer(3); wordOccurrencesArray[2][0]=new String("IRELAND"); wordOccurrencesArray[2][1]=new Integer(2); wordOccurrencesArray[3][0]=new String("helps"); wordOccurrencesArray[3][1]=new Integer(24); wordOccurrencesArray[4][0]=new String("snagging"); wordOccurrencesArray[4][1]=new Integer(1); wordOccurrencesArray[5][0]=new String("3pxborder1px"); wordOccurrencesArray[5][1]=new Integer(4); wordOccurrencesArray[6][0]=new String("asArea"); wordOccurrencesArray[6][1]=new Integer(1); wordOccurrencesArray[7][0]=new String("ADDTHIS"); wordOccurrencesArray[7][1]=new Integer(4); wordOccurrencesArray[8][0]=new String("long-standing"); wordOccurrencesArray[8][1]=new Integer(6); wordOccurrencesArray[9][0]=new String("manufacturing"); wordOccurrencesArray[9][1]=new Integer(8); wordOccurrencesArray[10][0]=new String("single"); wordOccurrencesArray[10][1]=new Integer(17); int size=wordOccurrencesArray.length; System.out.println("\n before sorting we have..."); for (int i=0;i<size;i++) System.out.println(wordOccurrencesArray[i][0]+"-->"+wordOccurrencesArray[i][1]); System.out.println("\n after sorting we have..."); for (int j=0;j<size;j++){ for (int k=j+1;k<11;k++){ int a=((Integer)wordOccurrencesArray[k][1]).intValue(); int b=((Integer)wordOccurrencesArray[j][1]).intValue(); if (a>{ temp1=wordOccurrencesArray[k][0]; temp2=wordOccurrencesArray[k][1]; wordOccurrencesArray[k][0]=wordOccurrencesArray[j][0]; wordOccurrencesArray[k][1]=wordOccurrencesArray[j][1]; wordOccurrencesArray[j][0]=temp1; wordOccurrencesArray[j][1]=temp2; } } } for (int i=0;i<11;i++) System.out.println(wordOccurrencesArray[i][0]+"-->"+wordOccurrencesArray[i][1]); } public static void main(String args[]){ new SortArray(); } }
Evangeli Δημοσ. 30 Ιουλίου 2009 Μέλος Δημοσ. 30 Ιουλίου 2009 Σ’ ευχαριστώ πάρα πολύ virxen75. Έπαιξε τέλεια και μάλιστα πολύ γρήγορα! Έχω πελαγώσει αυτό το διάστημα και ούτε κάτι τόσο βασικό δεν είμαι σε θέση να σκεφτώ. Το πρόβλημα επιλύθηκε. Ευχαριστώ και πάλι. Βαγγέλης.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.