1

電話のPIMから読み取ったデータを並べ替える必要があるというバインドに遭遇しました。これを行う際に、以下に示すように2つの別々のベクトルを使用したため、各連絡先フィールドが電話番号を参照しているもう一方を失いました。
並べ替える前に

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

これにより、ソートによってベクトルのインデックスからインデックスへのポインタが削除され、選択した名前([複数のリストボックス]で)が間違った番号を取得するため、望ましくない動作が発生します。
または、
名前をキーとして、数値を値として使用することを目的として、ハッシュテーブルを使用しました。
ただし、このペアリングは、キーとして使用される重複した名前が許可されないことを意味します。したがって、私はそれを代わりにキーとしての電話番号にしました。泣き虫のように聞こえたくないので、しばらくここで立ち止まります。そうすれば、皆さんが理解してくれることを願ってコードを作成できます。

私の質問
1.これを実装するためのより良い方法/アルゴリズムはありますか?
2.ハッシュテーブルから複数選択リストの選択されたインデックスの番号を取得するような方法でgetSelectedItems()を実装するにはどうすればよいですか。

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

4 に答える 4

3

要件を繰り返します。ネイティブの電話帳から読み取った連絡先を並べ替えてから、名前のアルファベット順に並べ替える方法が必要です。

以下はアプローチです、

contactListVectorコード内のベクトルとハッシュテーブルを、たとえば、タイプの要素を含む単一のベクトルに置き換えContactItemます。このクラスについて以下で説明します。基本的に、連絡先の名前番号はでリンクされているContactItemため、冗長なデータ構造の使用を減らすマッピングについて心配する必要はありません。

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

ベクトル要素contactListVectorのメンバー変数を比較することにより、並べ替えアルゴリズムを再利用できます。また、メンバー変数の番号名前ContactItem.nameにさまざまな種類をデプロイできます。また、JavaME用のライブラリがたくさんあり、必要に応じてそれらを使用するために、より適切なソートアルゴリズムが実装されています。

contactListVectorメソッドの最後にある要素に対して、loadNames(...)ブール変数によってトリガーされたfinallyブロックで1回ソートを実行することをお勧めします。列挙の各反復での現在の並べ替え呼び出しは、items費用と時間がかかります。

また、シリアル化/逆シリアル化してContactItem、連絡先リストを永続化することもできます。

詳細な説明が必要な場合はお知らせください。

于 2011-12-06T15:58:29.490 に答える
1

連絡先の名前と番号をrecordStore内に挿入すると、後でを実装するクラスを作成して並べ替えを行うことができますRecordComparator

于 2011-12-06T13:56:34.253 に答える
1

コード内のこのステートメントは意味がありません。

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

上記のlcduiリストAPIのドキュメントごとに、選択した要素の数に等しいインデックスにある文字列が返されます。なぜそれが必要なのですか?


デバッグ目的で選択したテキストを出力する必要がある場合は、lbx.getString(i)代わりにを使用してください。

複数選択リストの選択されたインデックスの数を取得するような方法でgetSelectedItems()を実装するには、次のようにします。

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

並べ替えのニーズについては、別の回答で提案されているように、適切に設計されたオブジェクトを削除しHashTableて使用するだけです。独自の並べ替えアルゴリズムまたはサードパーティのJ2MEライブラリからのものを使用します。Vector

于 2011-12-06T17:49:19.260 に答える
-1

Contact名前と数のベクトルを持つクラスを持つことをお勧めします。また、名前の配列を並べ替える代わりに、連絡先の配列を並べ替えます。

于 2011-12-06T12:26:33.433 に答える