Java将Object []数组转换为Vector

10

将一个对象数组转换为向量,最好的方法是什么?

JDE < 1.5

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

this.elements是一个Object[]

谢谢, rAyt

我应该澄清我的问题

我的目标平台是黑莓。

Collections不受支持。 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;
                    }
                }
        }        
    }    
}
6个回答

37
return new Vector(Arrays.asList(elements));

现在看起来好像你在复制数据两次,但实际上并没有。你确实得到了一个小的临时对象(asList返回的List),但它提供了对数组的视图。读写操作会通过该视图直接访问原始数组,而不是复制它。

可以扩展 Vector 并访问其 protected 字段。这将为 Vector 提供一种相对简单的方式,使其成为数组的视图,就像 Arrays.asList 所做的那样。或者,只需将数据复制到字段中即可。对于 Java ME 来说,这已经是最好的方法了,除非编写明显的循环。未经测试的代码:

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

当然,使用ListVector更好。1.4已经完成了其服务生命周期期限。即使1.5也已经完成了大部分EOSL期限。


哇,第二个解决方案看起来真的很优雅! - Henrik P. Hessel
我认为“inventive”需要加引号。 :) - Tom Hawtin - tackline

2
在J2ME中,您需要迭代数组并逐个添加元素。
Vector v = new Vector();
for (int i = 0; i < this.elements.length; i++) {
    v.add(this.elements[i]);
}

我应该明白为什么研究动力公司提供类似SortedReadableList的东西,它有一个LoadFrom方法,但没有LoadTo方法吗?! :) - Henrik P. Hessel

1

在我看来,你唯一可行的选择是:

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多个对象复制到对象数组中会很麻烦。 - Henrik P. Hessel
2
如果您担心这个问题,您可以在Vector构造函数中投入一个元素长度的initialCapacity。 - Carl Manaster

1
一个简化的比较器,基本上做着同样的事情。
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());
    }
}

但是回答你的问题...(哦,我看到Tom已经写了我想写的)


我的Java版本也不支持泛型!但是感谢你的提示+1。 - Henrik P. Hessel

1

一种相对简洁的方法是:

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

但是,我猜你们已经知道了。

1
  1. 将数组元素复制到 Vector 中,或者

  2. 使用 Arrays.asList(...) 返回一个 List,虽然它不是一个严格的 Vector,但你应该编写 List 接口。


2
那么,没有其他方法可以避开 for 循环了吗? - Henrik P. Hessel
我建议选择选项2,但值得注意的是,这并不会复制数组,它只是将其包装起来。我不建议选项1,即除非你真的需要,否则不要使用向量。 - Peter Lawrey
即使有内置函数来完成这个任务,它仍然会在后台使用for循环。没有魔法 :) - mechanical_meat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接