【问题标题】:Java Convert Object[] Array to VectorJava 将 Object[] 数组转换为向量
【发布时间】:2009-07-12 18:43:14
【问题描述】:

将 Object 数组转换为 Vector 的最佳方法是什么?

JDE

public Vector getListElements()
{
  Vector myVector = this.elements;
  return myVector;
}

this.elements 是一个对象[]

谢谢, 雷特

我应该澄清我的问题

我的目标平台是黑莓。

不支持集合。 Array.asList() 也不是:/

全班

package CustomElements;

import net.rim.device.api.ui.component .*;
import net.rim.device.api.collection.util.*; 
import net.rim.device.api.util.*;
import java.util.*;

public class ContactsList extends SortedReadableList implements KeywordProvider
{
    // Constructor
    public ContactsList(Vector contacts)
    {
        super(new ContactsListComparatorByFirstName());    
        loadFrom(contacts.elements());      
    }
    // Add Element to ContactsSortedReadableList
    void addElement(Object element)
    {
        doAdd(element); 
    }   

    public Vector getListElements()
    {
        return new Vector(Collection


        Vector test = this.getElements();
    }
    // getKeywords
    public String[] getKeywords(Object element) 
    {
        return StringUtilities.stringToWords(((Contact)element).get_contactFirstName());
        // return StringUtilities.stringToWords(element.toString());
    }  
    //  Comparator sorting Contact objects by name
    final static class ContactsListComparatorByFirstName implements Comparator
    {                           
        public int compare(Object o1, Object o2)
        {
            // Sticky Entries Implementation
            if(((ContactsListObject)o2).getSticky())
            {
                return 1;
            } else
                if (((ContactsListObject)o1).getSticky())
                {
                    return -1;
                } else
                {
                    if(((ContactsListObject)o1).get_contactFirstName().compareTo(((ContactsListObject)o2).get_contactFirstName()) <0)
                    {
                        return -1;
                    }
                    if(((ContactsListObject)o1).get_contactFirstName().compareTo(((ContactsListObject)o2).get_contactFirstName()) >0)
                    {
                        return 1;
                    }
                    else
                    {
                        return 0;
                    }
                }
        }        
    }    
}

【问题讨论】:

    标签: java arrays java-me vector


    【解决方案1】:
    return new Vector(Arrays.asList(elements));
    

    现在,您可能看起来好像要复制数据两次,但实际上并非如此。您确实得到了一个小的临时对象(来自asListList),但这提供了数组的视图。不是复制它,而是对原始数组进行读写操作。

    可以扩展Vector 并戳它的protected 字段。这将提供一种相对简单的方法,让Vector 成为数组的视图,就像Arrays.asList 所做的那样。或者,只需将数据复制到字段中。对于 Java ME,在不编写明显循环的情况下,这几乎是一样好。未经测试的代码:

    return new Vector(0) {{
        this.elementData = (Object[])elements.clone();
        this.elementCount = this.elementData.length;
    }};
    

    当然,使用List 可能比使用Vector 更好。 1.4 已完成其使用寿命终止期。甚至 1.5 已经完成了它的大部分 EOSL 周期。

    【讨论】:

    • 哇,第二个解决方案看起来,太优雅了!
    • 我认为“创新”需要引号。 :)
    【解决方案2】:

    在 J2ME 中,您被困在遍历数组并一一添加元素。

    Vector v = new Vector();
    for (int i = 0; i < this.elements.length; i++) {
        v.add(this.elements[i]);
    }
    

    【讨论】:

    • 我应该明白为什么 Research in Motion 提供了类似 SortedReadableList 的东西,它有一个 LoadFrom 方法,但没有 LoadTO 方法?! :)
    【解决方案3】:

    一个简化的比较器,它基本上做同样的事情。

    final static class ContactsListComparatorByFirstName implements Comparator {
        public int compare(Object o1, Object o2) {
                // Sticky Entries Implementation
            ContactsListObject clo2 = (ContactsListObject) o2;
            ContactsListObject clo1 = (ContactsListObject) o1;
            if (clo2.getSticky()) return 1;
            if (clo1.getSticky()) return -1;
            return clo1.get_contactFirstName().compareTo(clo2.get_contactFirstName());
        }
    }    
    

    使用泛型和 ?: 就可以了

    static final class ContactsListComparatorByFirstName implements Comparator<ContactsListObject> {
        public int compare(ContactsListObject clo1, ContactsListObject clo2) {
            return clo2.getSticky() ? 1 : // Sticky Entries Implementation
                clo1.getSticky() ? -1 :
                clo1.get_contactFirstName().compareTo(clo2.get_contactFirstName());
        }
    }
    

    但是要回答你的问题......(哦,我知道汤姆已经有了我想要的东西)

    【讨论】:

    • 我的 java 版本也不支持泛型!但是感谢您的提示 +1
    【解决方案4】:

    恕我直言,您唯一可行的选择是:

    public Vector getListElements()
        Vector vector = new Vector(this.elements.length);
    
        for (int i = 0; i < this.elements.length; i++) {
            vector.add(this.elements[i]);
        } 
    
        return vector;
    }
    

    【讨论】:

    • 是的,好像是这样。将在对象数组中复制 1000 多个对象。
    • 如果你担心它,你可以在 Vector 构造函数中加入一个 element.length 的 initialCapacity。
    【解决方案5】:
    1. 将数组元素复制到Vector,或者

    2. 使用Arrays.asList(...)返回List,它不完全是Vector,但无论如何你都应该编写List接口。

    【讨论】:

    • 那么,没有办法绕过 for 循环?
    • 我建议选项 2,但值得注意的是,这不会获取数组的副本,它只会包装它。我不会建议选项 1,即除非你真的需要,否则不要使用向量。
    • @rAyt:即使有一个内置函数可以这样做,它仍然会在幕后使用 for 循环。没有魔法:)
    【解决方案6】:

    一个相当简洁的方法是这样的:

    Object[] xx = { 1, "cat", new Point(100,200) };
    Vector vv = new Vector(Arrays.asList(xx));
    System.out.println("vv=="+vv.toString());
    

    但我猜你们都已经知道了。

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2013-04-01
      相关资源
      最近更新 更多