2011-12-06 27 views
1

我碰到了一个绑定,我必须对从手机PIM读取的数据进行排序。在这样做时我失去了其他到如下图所示
排序实现从电话簿中读取联系人在J2ME中使用Hashtable

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

这使不期望的行为,因为排序移除之前每个接触领域进行了参照的是电话号码,因为我利用2个单独的载体索引指向矢量的指针和选定的名称(在多个列表框中)将得到错误的数字。
或者,
我使用了一个哈希表,其目的是使用名称作为键和数字作为值。
但是这种配对意味着重复名称被用作键不会被允许。因此,我将其作为电话号码而不是密钥。 我不想听起来像一个婴儿哭,所以我在这里停了一段时间,所以你有希望的代码能跟大家会理解

我的问题
1.是否有更好的办法/算法来实现这个?
2.如何实现这抓住了多项选择列表中选定的指标的数量从一个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)); 
    } 
} 

回答

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

可以通过比较向量元素的成员变量ContactItem.name重用上contactListVector排序算法。您也可以在成员变量号码和/或名称上部署不同的类别。另外还有很多JavaME可用的库,如果需要使用它们,可以实现更好的排序算法。

我建议你在方法末尾的contactListVector元素上执行一次排序,loadNames(...)可能在由某个布尔变量触发的finally块中。枚举中的每次迭代中的当前分类调用都是昂贵且耗时的。

此外,您可以序列化/反序列化ContactItem从而坚持您的联系人列表。

让我知道你是否需要详细的解释。

+0

非常感谢。我正在努力实现你给的,我会让你知道如果我需要更多的解释 – nnanna

+0

最受欢迎... – Vimal

-1

我建议getSelectedItems()以这样一种方式,你有Contact类名和数字矢量。而不是排序名称数组排序联系人数组。

+0

与Java SE相反,Java ME [MIDP API]中没有'Comparator'(http://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/index。 html) – gnat

+0

我完全忘了我们有自己的比较器接口和排序实用程序方法 –

1

如何在recordStore中插入联系人姓名和号码,以便稍后可以通过创建实现RecordComparator的类进行排序。

1

代码中的这种说法是没有意义的:

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

lcdui List API documentation上面将返回位于该指数等于在字符串中选择元素为什么您需要多少?


如果需要输出选定的文本进行调试,使用lbx.getString(i)来代替。

实现这样的方式getSelectedItems(),它抓住了多项选择LIST所选指标的数量做一下如下:

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并使用Vector正确设计的对象,而不是像another answer中所建议的那样 - 使用您自己的排序算法或来自某个第三方J2ME库的算法。

相关问题