【问题标题】:Convert from vector of arrays to one array从数组向量转换为一个数组
【发布时间】:2011-02-16 16:39:04
【问题描述】:

我有一个浮点数组向量,即 Vector 。我想将其转换为一个浮点数组,即将向量中每个浮点 [] 中的每个元素移动到一个新的浮点 []。我对使用 Java 内置方法 vector.toArray() 来做到这一点有点困惑。有什么想法吗?

【问题讨论】:

    标签: java vector type-conversion


    【解决方案1】:

    有几种方法可以做到这一点。您可以调用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]"
        }
    }
    

    有了Guava,看起来你可以用Floats.concat(float[]...)一行来做到这一点:

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

    另见


    还应注意,除非您需要Vector 的线程安全,否则您可能应该改用ArrayList

    另见

    【讨论】:

    • 谢谢,我现在就试试这个。 “还应该注意的是,除非你需要 Vector 的线程安全,否则你应该使用 ArrayList 来代替。”你能解释一下吗?目前我有一个线程添加到我的向量中,你的建议会影响我的实现吗?
    • @Afro:如果有对Vector 的并发访问,那么是的,您可能希望将其保留为Vector。同步可能很昂贵,而且并不总是需要,这就是我建议ArrayList 的原因。这就像StringBuilder vs StringBuffer 问题。
    • @polygenelubricants:啊哈,现在我明白了。我会给你一个更大的画面,说明目前正在尝试做的事情是非常错误的。数组向量实际上是声音字节数组,我没有写入底层系统音频,而是转移到这个向量中。完成后,我读入向量并将这些字节数组转换为浮点数组,因为我的应用程序处理声音为浮点数。当我这样做并尝试向我的应用程序提供浮点数时,我得到的只是静态声音而不是预期的音频。
    • 我只能想象这与不将数据作为帧处理有关吗?您知道如何将这些原始数据转换为声音帧吗?
    • @Afro:这完全是一个不同的问题,不,我不知道音频处理的细节,抱歉。如果这个特定问题得到了满意的回答,您可以接受它(单击复选标记),您可以针对音频数据内容提出另一个问题。把你需要帮助的地方写清楚,我相信其他更有资格的人可以帮助你。
    【解决方案2】:

    Vector.toArray() 将为您提供一个数组数组,即二维数组。一旦你有了它,你可以迭代数组直到长度并将每个单独的数组复制到一个大数组中。

    适合你吗?

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多