List <String>からArrayList <String>への変換の問題


91

私は次の方法を持っています...実際に文のリストを取り、各文を単語に分割します。はい、これ:

public List<String> getWords(List<String> strSentences){
allWords = new ArrayList<String>();
    Iterator<String> itrTemp = strSentences.iterator();
    while(itrTemp.hasNext()){
        String strTemp = itrTemp.next();
        allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+"));          
    }
    return allWords;
}

このリストを次の形式でハッシュマップに渡す必要があります

HashMap<String, ArrayList<String>>

したがって、このメソッドはListを返し、arrayListが必要ですか?キャストしようとしてもうまくいきません...何か提案はありますか?

また、HashMapでArrayListをListに変更すると、次のようになります。

java.lang.UnsupportedOperationException

私のコードのこの行のため

sentenceList.add(((Element)sentenceNodeList.item(sentenceIndex)).getTextContent());

より良い提案はありますか?

回答:


53

まず第一に、なぜマップはaでHashMap<String, ArrayList<String>>あり、ではないのHashMap<String, List<String>>ですか?値がインターフェイスの特定の実装ListArrayListこの場合)でなければならない理由はありますか?

Arrays.asListはを返さjava.util.ArrayListないため、の戻り値Arrays.asListをタイプの変数に割り当てることはできませんArrayList

の代わりに:

allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+"));

これを試して:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));

3
具体的にUnsupportedOperationExceptionは、Arrays.asListメソッドが配列に基づく固定サイズのリストを返すために発生します。変更することはできません。@Jesperによってここに提示されたソリューションはそれを回避します。
ダンカンジョーンズ

191

キャストは、リストの実際のインスタンスがである場合に機能しますArrayList。たとえば、Vector(の別の拡張であるList)の場合、ClassCastExceptionがスローされます。

HashMapの定義を変更するときのエラーは、後で処理される要素が原因であり、そのプロセスはでのみ定義されているメソッドを想定していArrayListます。例外は、探していたメソッドが見つからなかったことを示しています。

ArrayList古いものの内容で新しいものを作成します。

new ArrayList<String>(myList);

41

ArrayList#addAll(Collection)を見てください

指定されたコレクションのすべての要素を、指定されたコレクションのイテレーターによって返される順序で、このリストの最後に追加します。操作の進行中に指定されたコレクションが変更された場合、この操作の動作は未定義です。(これは、指定されたコレクションがこのリストであり、このリストが空でない場合、この呼び出しの動作が未定義であることを意味します。)

だから基本的にあなたは使うことができます

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);

13

Kotlinでは、リストをコンストラクターパラメーターとして渡すことでArrayListに変換できます。

ArrayList(list)


0

アプローチを試し、テストしました。

public static ArrayList<String> listToArrayList(List<Object> myList) {
        ArrayList<String> arl = new ArrayList<String>();
        for (Object object : myList) {
            arl.add((String) object);
        }
        return arl;

    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.