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

[Λύθηκε] Ταξινόμηση δυσδιάστατου Object πίνακα – Java


Evangeli

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

Δημοσ.

Καλησπέρα

 

Ψάχνω έναν αποδοτικό τρόπο να ταξινομήσω έναν πολύ μεγάλο πίνακα της τάξης των δεκάδων χιλιάδων γραμμών. Δοκίμασα τον 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();

 

Βαγγέλης.

Δημοσ.

Ρίξε μια ματιά

Collections Algorithms

και

Collection#sort

 

Τα data από που τα διαβάζεις? (database, file, over the network, etc)

 

Αν όντως είναι "τόσα πολλά" τότε ίσως χρειαστεί να χρησιμοποιήσεις threads με κάθε thread να κάνει ξεχωριστά το sorting. Ενδεικτικά δες το άρθρο περί ParallelArray (unreleased Java 7)

Δημοσ.

η ταξινόμηση θα είναι μία και έξω?

ή θα γίνεται σε κάθε εκτέλεση του προγράμματος?

 

τα δεδομένα από που προκύπτουν?

που φυλάσονται?

Δημοσ.

Τα δεδομένα βρίσκονται τόσο σε αρχείο όσο και σε πίνακα. Η δομή του πίνακα είναι όπως προανέφερα. Αργότερα θα ρίξω μια ματιά στα links του Cue και θα σας πω. Δεν με νοιάζει η ταχύτητα του αλγορίθμου, απλά θέλω να μπορεί να χειριστεί μεγάλο όγκο δεδομένων...

 

Βαγγέλης.

Δημοσ.

δεν μου απάντησες αν θες η ταξινόμηση να γίνει μία φορά

και να αποθηκευτούν ταξινομημένα σε αρχείο τα δεδομένα σου

 

έτσι όταν θα χρειαστείς αργότερα να προσθέσεις κάτι το βάζεις απευθείας

στην σωστή θέση ταξινομημένο δηλαδή στο αρχείο και πάλι ώστε να γλιτώσεις

χρόνο.

Δημοσ.
δεν μου απάντησες αν θες η ταξινόμηση να γίνει μία φορά

και να αποθηκευτούν ταξινομημένα σε αρχείο τα δεδομένα σου

 

έτσι όταν θα χρειαστείς αργότερα να προσθέσεις κάτι το βάζεις απευθείας

στην σωστή θέση ταξινομημένο δηλαδή στο αρχείο και πάλι ώστε να γλιτώσεις

χρόνο.

 

Ναι. Μια φορά θα κάνουμε ταξινόμηση. Μετά, την αποθήκευση στο αρχείο ξέρω πως να την κάνω. Δεν σκοπεύω να προσθέτω και να αφερώ δεδομένα.

Δημοσ.

ωραία

 

ο πίνακας σου είναι είπες 2 διαστάσεων

τι δεδομένα έχει η κάθε στήλη του και με βάση πιο κριτήριο θέλεις

την ταξινόμηση?

 

στείλε έναν εικονικό πίνακα 5 θέσεων με τα περιεχόμενα πριν την

ταξινόμηση και πως τα θες μετά την ταξινόμηση για να καταλάβω τι

ακριβώς θες και θα σου στείλω τον κώδικα που θες

Δημοσ.
ωραία

 

ο πίνακας σου είναι είπες 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

Δημοσ.

Πρωταση:

Κανε μια κλαση η οποια θα εχει ενα object και ενα int

>class SomeObject
{
public object Obj;
public int ObjInt;
}

βαλτης και του operators <,>,==,!= με κριτηριο το ObjInt.

Δημοσ.
Πρωταση:

Κανε μια κλαση η οποια θα εχει ενα object και ενα int

>class SomeObject
{
public object Obj;
public int ObjInt;
}

βαλτης και του operators <,>,==,!= με κριτηριο το ObjInt.

 

Thanks Evgenios1 για την απάντηση. Αλλα βασικά δεν κατάλαβα πως θα το χρεισιμοποιήσω! Εγώ αναζήτηση θέλω να κάνω!

Δημοσ.

δες αυτό

 

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();
}

}


Δημοσ.

Σ’ ευχαριστώ πάρα πολύ virxen75. Έπαιξε τέλεια και μάλιστα πολύ γρήγορα! Έχω πελαγώσει αυτό το διάστημα και ούτε κάτι τόσο βασικό δεν είμαι σε θέση να σκεφτώ. Το πρόβλημα επιλύθηκε. Ευχαριστώ και πάλι.

 

Βαγγέλης.

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

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

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