Domanda

Mi sono imbattuto in un legame per cui ho dovuto ordinare i dati letti dal pim dei telefoni. Nel fare ciò ho perso l'altro a cui ogni campo di contatto è stato fatto riferimento al numero di telefono perché ho utilizzato 2 vettori separati come illustrato di seguito
Prima di ordinare

 Nna - +445535533                       
Ex - +373773737                         
Ab - +234575757                         
After sorting.(Which shouldn't be)
 Ab - +445535533
 Ex - +373773737
 Nna  - +234575757

Ciò fornisce un comportamento indesiderato poiché l'ordinamento rimuove l'indice per indicizzare il puntatore dei vettori e un nome selezionato (in una casella di riepilogo multipla) riceverà un numero sbagliato.
In alternativa,
Ho usato un hashtable, con l'intenzione di usare i nomi come chiavi e numeri come valori.
Ma questo accoppiamento significa che i nomi duplicati vengono utilizzati come chiavi non saranno consentiti. Così l'ho fatto invece un numero di telefono come tasti. Non voglio sembrare un bambino grido, quindi mi fermo qui per un po 'e quindi il codice con una speranza che voi ragazzi lo capite

LA MIA DOMANDA
1. Esiste un modo/algoritmo migliore per implementarlo?
2. Come si implementa i getSelectedItems () in modo tale da afferrare i numeri degli indici selezionati di un elenco di scelte multiple da un hashtable

import java.util.Enumeration;
import java.util.Vector;
import java.util.Hashtable;
import javax.microedition.lcdui.List;
import javax.microedition.pim.Contact;
import javax.microedition.pim.ContactList;
import javax.microedition.pim.PIM;
import javax.microedition.pim.PIMException;

/**
 *
 * @author nnanna
 */
public class LoadContacts implements Operation {

    private boolean available;
    private Vector telNames = new Vector();
    Vector telNumbers = new Vector();
    Hashtable Listcontact = new Hashtable();
    private String[] names;

    public Vector getTelNames() {
        return telNames;
    }

    public Hashtable getListcontact() {
        return Listcontact;
    }

    public void execute() {
        try {
// go through all the lists
            String[] allContactLists = PIM.getInstance().listPIMLists(PIM.CONTACT_LIST);

            if (allContactLists.length != 0) {
                for (int i = 0; i < allContactLists.length; i++) {
                    System.out.println(allContactLists[i]);
                    System.out.println(allContactLists.length);
                    loadNames(allContactLists[i]);
                    System.out.println("Execute()");
                }

            } else {
                available = false;
            }
        } catch (PIMException e) {
            available = false;

        } catch (SecurityException e) {
            available = false;

        }
    }

    private void loadNames(String name) throws PIMException, SecurityException {
        ContactList contactList = null;

        try {
            contactList = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY, name);
            // First check that the fields we are interested in are supported(MODULARIZE)
            if (contactList.isSupportedField(Contact.FORMATTED_NAME) && contactList.isSupportedField(Contact.TEL)) {
                Enumeration items = contactList.items();
                Hashtable temp = new Hashtable();
                while (items.hasMoreElements()) {
                    Contact contact = (Contact) items.nextElement();
                    int telCount = contact.countValues(Contact.TEL);
                    int nameCount = contact.countValues(Contact.FORMATTED_NAME);
                    if (telCount > 0 && nameCount > 0) {
                        String contactName = contact.getString(Contact.FORMATTED_NAME, 0);
                        // go through all the phone availableContacts

                        for (int i = 0; i < telCount; i++) {
                            System.out.println("Read Telno");
                            int telAttributes = contact.getAttributes(Contact.TEL, i);
                            String telNumber = contact.getString(Contact.TEL, i);
                            Listcontact.put(telNumber, contactName);
                            temp.put(contactName, telNumber);
                        }
                        names = getSortedList();
//                            Listcontact = temp;
                        System.out.println(temp + "-------");
                        System.out.println(Listcontact + "*******");
                        shortenName(contactName, 20);
                    }
                    available = true;
                }
            } else {
                available = false;
            }
        } finally {
// always close it
            if (contactList != null) {
                contactList.close();
            }
        }
    }

    private void shortenName(String name, int length) {
        if (name.length() > length) {
            name = name.substring(0, 17) + "...";
        }
    }

    public Vector getSelectedItems(List lbx) {
        boolean[] arrSel = new boolean[lbx.size()];
        Vector selectedNumbers = new Vector();
        int selected = lbx.getSelectedFlags(arrSel);
        String selectedString;
        String result = "";
        for (int i = 0; i < arrSel.length; i++) {
            if (arrSel[i]) {
                selectedString = lbx.getString(lbx.getSelectedFlags(arrSel));
                result = result + " " + i;
                System.out.println(Listcontact.get(selectedString));
//                System.out.println(telNumbers.elementAt(i));
            }
        }
        return selectedNumbers;
    }

    private String[] sortResults(String data[]) {
        RecordSorter sorter = new RecordSorter();
        boolean changed = true;
        while (changed) {
            changed = false;
            for (int j = 0; j < (data.length - 1); j++) {
                String a = data[j], b = data[j + 1];
                if (a != null && b != null) {
                    int order = sorter.compare(a.getBytes(), b.getBytes());
                    if (order == RecordSorter.FOLLOWS) {
                        changed = true;
                        data[j] = b;
                        data[j + 1] = a;
                    }
                }
            }
        }
        return data;
    }

    public String[] getNames() {
        return names;
    }
        Vector elements = new Vector();
    private String[] getValueArray(Hashtable value) {

        System.out.println(Listcontact + " c");
        Enumeration e = value.elements();
        while (e.hasMoreElements()) {
            elements.addElement(e.nextElement());
        }
        String[] elementsArray = new String[elements.size()];
        elements.copyInto(elementsArray);
        elements.removeAllElements();
        System.out.println(elementsArray + " k");
        return elementsArray;
    }

    public void getDuplicates(Vector realValue) {
        Vector duplicate = new Vector();
        Enumeration e = realValue.elements();
        for (int i = 0; e.hasMoreElements(); i++) {
            if (duplicate.isEmpty() || !duplicate.elementAt(i).equals(e.nextElement())) {
                break;
            } else {
                duplicate.addElement(e.nextElement());
            }
        }
    }

    public String[] getSortedList() {
        return sortResults(getValueArray(Listcontact));
    }
}
È stato utile?

Soluzione

Lascia che ti reiterà il tuo requisito: vuoi un metodo che ordinerà i contatti letti dalla rubrica nativa, quindi ordinali in ordine alfabetico sul nome.

Di seguito è riportato l'approccio,

Sostituisci i vettori e gli hash-table nel codice con un singolo vettore, diciamo contactListVector, contenente elementi di tipo ContactItem, non preoccuparti che questa classe è spiegata di seguito. Fondamentalmente i contatti nome e numeri) sono collegati insieme in a ContactItem, quindi non devi preoccuparti delle mappature che riducono l'uso di strutture di dati ridondanti.

class ContactItem {
    private String name;
    private String tnumber;  //this can also be a data structure 
                             //for storing multiple numbers

    ContactItem( String name, String tnumber) {
        this.name = name;
        this.tnumber = tnumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTnumber() {
        return tnumber;
    }

    public void setTnumber(String tnumber) {
        this.tnumber = tnumber;
    }        
}

Puoi riutilizzare l'algoritmo di smistamento contactListVector confrontando la variabile membro ContactItem.name dell'elemento vettoriale. Inoltre è possibile distribuire diversi tipi sulle variabili dei membri numeri e/o nomi. Inoltre ci sono molte librerie per Javame disponibili che hanno un migliore algoritmo di smistamento implementato se è necessario usarle.

Ti consiglierei di eseguire l'ordinamento una volta sul contactListVector elementi alla fine del tuo metodo loadNames(...) Forse nel blocco finalmente innescato da una variabile booleana. L'attuale smistamento chiamata in ogni iterazione items L'enumerazione è costosa e richiede tempo.

Inoltre puoi serializzare / deserializzare il ContactItem Così persistono la tua lista di contatti.

Fammi sapere se hai bisogno di una spiegazione dettagliata.

Altri suggerimenti

Che ne dici di inserire il nome di contatto e i numeri all'interno di un recordstore, quindi puoi successivamente fare un tipo creando una classe che implementa RecordComparator.

Questa affermazione nel tuo codice non ha senso:

selectedString = lbx.getString(lbx.getSelectedFlags(arrSel))

Per Documentazione API LCDUI Elenco sopra restituirà la stringa situata all'indice uguale a il numero di elementi selezionati Perché dovresti averne bisogno?


Se è necessario emettere un testo selezionato per scopi di debug, utilizzare lbx.getString(i) invece.

Per Implementa i getSelectedItems () in modo tale da afferrare i numeri degli indici selezionati di un elenco a scelta multipla fare come segue:

    public Vector getSelectedItems(List lbx) {
        boolean[] arrSel = new boolean[lbx.size()];
        Vector selectedNumbers = new Vector();
        int selected = lbx.getSelectedFlags(arrSel);
        System.out.println("selected: [" + selected + "] elements in list");
        String selectedString;
        String result = "";
        for (int i = 0; i < arrSel.length; i++) {
            if (arrSel[i]) {
                // here, i is the selected index
                selectedNumbers.addElement(new Integer(i)); // add i to result
                String selectedString = lbx.getString(i);
                System.out.println("selected [" + selectedString
                        + "] text at index: [" + i + "]");
            }
        }
        return selectedNumbers;
    }

Per quanto riguarda le esigenze di smistamento, lascia cadere il HashTable e usa Vector di oggetti progettati correttamente invece come suggerito in Un'altra risposta - Con il tuo algoritmo di smistamento o uno di una biblioteca J2ME di terza parte.

Ti suggerirei di avere Contact classe con nome e vettore di numeri. E invece di ordinare i nomi Array Ordinare l'array di contatti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top