Преобразовать из вектора массивов в один массив - PullRequest
1 голос
/ 07 мая 2010

У меня есть вектор массивов с плавающей запятой, т.е. Vector. Я хочу преобразовать это в один массив float, то есть переместить каждый элемент в каждом float [] в векторе в новый float []. Я немного озадачен использованием встроенного Java-метода vector.toArray () для этого. Есть идеи, пожалуйста?

Ответы [ 2 ]

1 голос
/ 07 мая 2010

Vector.toArray () предоставит вам массив массивов, то есть двумерный массив.когда у вас есть это, вы можете перебрать массив до длины и скопировать каждый отдельный массив в один большой массив.

Работает для вас?

1 голос
/ 07 мая 2010

Есть несколько способов сделать это. Вы можете вызвать toArray(), чтобы получить несколько массивов, а затем объединить их в один большой массив (для этого у Guava есть служебный метод). Или вы можете выделить один большой массив и затем использовать System.arraycopy, чтобы скопировать массив компонентов в соответствующую часть большого массива.

Вот пример последнего:

import java.util.*;

public class Flatten {
    static float[] flatten(float[]... arrs) {
        int L = 0;
        for (float[] arr : arrs) {
            L += arr.length;
        }
        float[] ret = new float[L];
        int start = 0;
        for (float[] arr : arrs) {
            System.arraycopy(arr, 0, ret, start, arr.length);
            start += arr.length;
        }
        return ret;
    }
    public static void main(String[] args) {
        Vector<float[]> v = new Vector<float[]>();
        v.add(new float[] { 1,2,3, });
        v.add(new float[] { 4, });
        v.add(new float[] {  });
        v.add(new float[] { 5,6, });

        float[] flattened = flatten(v.toArray(new float[0][]));
        System.out.println(Arrays.toString(flattened));
        // prints "[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]"
    }
}

С Гуава похоже, что вы можете сделать это одной строкой, используя Floats.concat(float[]...):

float[] flattened = Floats.concat(v.toArray(new float[0][]));

Смотри также


Следует также отметить, что если вам не нужна безопасность потоков Vector, вам, вероятно, следует использовать ArrayList.

Смотри также

...