Вопрос по vector, arrays, java, java-me – Java Convert Object [] Массив в Вектор

9

Какой наилучший способ преобразовать массив объектов в вектор?

JDE & lt; 1,5

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

this.elements - это объект []

Спасибо, Rayt

I should clarify my question

Моя целевая платформа - ежевика.

Коллекции не поддерживаются. 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   ответов
0

Достаточно краткий способ сделать это что-то вроде:

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

Но вы, наверное, все это уже знали.

1
  1. Copy the array elements to the Vector, or

  2. Use Arrays.asList(...) to return a List, which isn't exactly a Vector, but you should be coding the List interface anyway.

Итак, нет ли способа обойти цикл? Henrik P. Hessel
Я предлагаю вариант 2, за исключением того, что стоит отметить, что это не берет копию массива, он только оборачивает его. Я бы не предложил вариант 1, то есть не использовать вектор, если вам действительно не нужно.
никакой магии ... черт возьми, вы исследуете в движении! Henrik P. Hessel
@rAyt: Даже если бы для этого была встроенная функция, она все равно использовала бы цикл «за кулисами». Нет волшебства :)
System.arraycopy это магия!
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());
    }
}

Но, чтобы ответить на ваш вопрос ... (о, я вижу, у Тома есть то, что я бы уже положил)

Дженерики также не поддерживаются в моей версии Java! Но спасибо за подсказку +1 Henrik P. Hessel
35
return new Vector(Arrays.asList(elements));

Теперь может показаться, что вы копируете данные дважды, но это не так. Вы получаете один маленький временный объект (List отasList), но это обеспечивает представление массива. Вместо того, чтобы копировать его, операции чтения и записи проходят через исходный массив.

Можно расширить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.

+1 путь.
Я думаю, что "изобретательский" нужны цитаты. :)
по-прежнему отличный ответ, нет причин, чтобы голосовать за него! Henrik P. Hessel
Очень изобретательно!
Ничего себе, второе решение выглядит просто элегантно! Henrik P. Hessel
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 ?! :) Henrik P. Hessel
1

imho ваш единственный жизнеспособный вариант:

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;
}
Если вас это беспокоит, вы можете добавить initialCapacity of elements.length в конструктор Vector.
Да, похоже так. собирается сосать, копируя 1000+ объектов в массиве объектов. Henrik P. Hessel
@Carl: исправлено, спасибо

Похожие вопросы