0

このコードを作成しましたが、実行時に次のエラーが発生します。

[Ljava.lang.Object; cannot be cast to [[Ljava.lang.String; 私を助けてください、ありがとう!!!

public  java.util.List<String>  concatAll(java.util.List<java.util.List<String>> mergedList) {



    java.lang.String [][] mergedArray = (String[][])mergedList.toArray();

    Iterator<java.util.List<String>> itr = mergedList.iterator();  
    java.util.List<String> list1 = itr.next();

          java.lang.String [] firstArray = (String[])list1.toArray();           

        int totalLength = firstArray.length;
          for (String[] array : mergedArray) {
            totalLength += array.length;
          }
          String[] result = Arrays.copyOf(firstArray, totalLength);
          int offset = firstArray.length;
          for (String[] array : mergedArray) {
            System.arraycopy(array, 0, result, offset, array.length);
            offset += array.length;
          }
          java.util.List<String> finalList = Arrays.asList(result);
          for (String list : finalList)
              System.out.println(list);

    return finalList;
}
4

5 に答える 5

3

mergedList.toArray()オブジェクト型の単一インデックス配列を作成します。

含まれる各オブジェクトは、実際には文字列の (単一インデックス付きの) リストですが、この呼び出し構文では、コンパイル時に型がわかりません。キャストが機能するために必要な文字列の配列ではありません。

ある種の連結操作によってaを aconcatAllに変換しようとしているので、 aにまったく変換せずにこれを行うのが最善かもしれませんが、その変換が必要な場合は、次のように実行できます。List<List<String>>List<String>String[][]

private String[][] toDoubleIndexArray(List<List<String>> mergedList) {
    String[][] result = new String[mergedList.size()][];
    for (int i = 0; i< mergedList.size(); i++) {
        List<String> currentList =  mergedList.get(i);
        result[i] = currentList.toArray(new String[currentList.size()]);
    }
    return result;
}

コメントでXavi Lopezが指摘したように、元の回答はまったく正しくありません:

mergedListhas typeであるためList<List<String>>mergedList.toArray()has typeList<String>[]です。つまり、これはリストの配列であり、二重インデックス配列ではありません。

于 2013-05-22T10:45:50.033 に答える
2

すぐに使える方法はありませんが、手動で行うのはかなり簡単です。

// Create the outer dimension of the array, with the same size as the total list
String[][] mergedArray = new String[mergedList.size()][];

// Now iterate over each nested list and convert them into the String[]
// instances that form the inner dimension
for (int i = 0; i < mergedList.size(); i++) {
    mergedArray[i] = mergedList.get(i).toArray(new String[0]);
}

ループ本体のもう少し効率的なバージョンは次のようになります。

List<String> innerList = mergedList.get(i);
String[] innerAsArray = innerList.toArray(new String[innerList.size()]);
mergedArray[i] = innerAsArray;

これにより、最初の例で必要となる配列のサイズ変更が回避されるためです (new String[0]はリスト要素を保持するのに十分な大きさではありません)。しかし、率直に言って、これがパフォーマンスに重大な影響を与えるループでない限り、何が起こっているのかが少し明確になっているため、最初のバージョンの方が好ましいと思います。

于 2013-05-22T10:56:03.857 に答える
0

多次元文字列リストを文字列配列に直接変換することはできません。mergedArray を使用する前に、次のコードを追加します。

/** Create Array **/     
String [][] mergedArray = new String[mergedList.size()][];

/** Initialize array from list **/  
for(int i=0; i< mergedList.size(); i++){
     mergedArray[i] = mergedList.get(i).toArray(new String[0]);
 }

これでうまくいくはずです

于 2013-05-22T10:56:44.423 に答える
0

配列の配列を返すことを意図している場合、戻り値の型が間違っていると思います。

これを試して:

public String[][] concatAll(java.util.List<java.util.List<String>> mergedList) {

    //java.lang.String [][] mergedArray = (String[][])mergedList.toArray();
    java.lang.String[][] mergedArray = new String[mergedList.size()][];

    Iterator<java.util.List<String>> itr = mergedList.iterator();
    int count = 0;
    while (itr.hasNext())
    {
        java.util.List<String> list1 = itr.next();
        String[] array1 = list1.toArray(new String[list1.size()]);
        mergedArray[count++] = array1;
    }


return mergedArray;
}
于 2013-05-22T10:56:59.493 に答える
-2

を変換することはできません

List<List<String>>

すぐに使える toArray 機能を使用して String[][] に変換します。これは、次の場合にのみ機能します。

List<String[]>. 
于 2013-05-22T10:46:04.560 に答える