如何在Java中将Collection <char []>转换为char [] []?

我正在尝试加速算法的现有实现,以使其在GPU上并行化,但是要做到这一点,我需要将所有数据类型转换为基元。

我有一个字符数组Collection<char[]>的集合,如何将其转换为字符数组char[][]的数组?

我尝试了final char[][] kernelFeatures = (char[][]) features.toArray();

但是,我收到一条错误消息java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [[C ([Ljava.lang.Object; and [[C are in module java.base of loader 'bootstrap')

abiaoa 回答:如何在Java中将Collection <char []>转换为char [] []?

问题

不能使用Collection#toArray()并将结果强制转换为char[][]的原因是:

  

返回的数组的runtime component typeObject


解决方案

Java 11之前的版本

您可以使用Collection#toArray(T[])来指定数组的组件类型。

Collection<char[]> collection = ...;
char[][] array = collection.toArray(new char[0][]);

要了解为什么不需要指定第二维,请记住Java中的二维数组只是一维数组,其中每个元素都是一个数组。有关更多信息,请参见以下问答:

关于使用0作为第一个维度,请注意,不需要使用0;您可以使用所需的任何有效长度(例如collection.size())。但是,使用0的原因是,至少在HotSpot 8上使用ArrayList时,据说效率更高:

我不确定在其他版本,其他JVM实现或其他Collection实现中它是否更有效。

Java 11 +

如果您使用的是Java 11+,则有一个替代解决方案:Collection#toArray(IntFunction)

Collection<char[]> collection = ...;
char[][] array = collection.toArray(char[][]::new);

作为lambda表达式,它看起来像:

Collection<char[] collection = ...;
char[][] array = collection.toArray(i -> new char[i][]);

手册副本

#toArray的两种方法最终都类似于以下内容:

Collection<char[]> collection = ...;

char[][] array = new char[collection.size()][];
int index = 0;
for (char[] element : collection) {
  array[index++] = element;
}

尽管您应该使用#toArray方法之一,因为它允许Collection实现使用其可以进行的任何优化。例如,ArrayList类使用System#arraycopy方法。

,

尝试一下:

const path = require('path');

// make sure sub-directory is created
let dirForFile = path.join(__dirname,someDir);
if (!fs.existsSync(dirForFile) {
    fs.mkDirSync(dirForFile);
}
// append data to the file
let pathToFile = path.join(dirForFile,"filename.txt");
fs.appendFileSync(pathToFile,dataToWrite);

或使用for循环打印

  List<char[]> list = List.of(new char[] { '1','2'
      },new char[] { '3','4'
      },new char[] { '6','7'
      });
      char[][] array = list.stream().toArray(char[][]::new);
      System.out.println(Arrays.deepToString(array));
本文链接:https://www.f2er.com/3156243.html

大家都在问