แสดงรายการ <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>>

ดังนั้นวิธีนี้จะส่งกลับรายการและฉันต้องการ arrayList? ถ้าลองแคสแล้วไม่ได้ออกกำลัง ... มีคำแนะนำไหม?

นอกจากนี้ถ้าฉันเปลี่ยน ArrayList เป็น List ใน HashMap ฉันจะได้รับ

java.lang.UnsupportedOperationException

เพราะบรรทัดนี้ในรหัสของฉัน

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

ข้อเสนอแนะที่ดีกว่านี้?

คำตอบ:


53

ก่อนอื่นทำไมแผนที่ถึงเป็นHashMap<String, ArrayList<String>>และไม่เป็นHashMap<String, List<String>>? มีเหตุผลบางประการที่ทำให้ค่าต้องเป็นการใช้งานอินเทอร์เฟซเฉพาะList( ArrayListในกรณีนี้)

Arrays.asListไม่ส่งคืน a 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 จะหลีกเลี่ยงสิ่งนั้น
ดันแคนโจนส์

192

แคสต์ทำงานโดยที่อินสแตนซ์จริงของรายการคือArrayListไฟล์. ถ้าเป็นเช่นนั้น a Vector(ซึ่งเป็นส่วนขยายอื่นของList) มันจะส่ง ClassCastException

ข้อผิดพลาดเมื่อเปลี่ยนคำจำกัดความของ HashMap ของคุณเกิดจากการประมวลผลองค์ประกอบในภายหลังและกระบวนการนั้นคาดว่าจะมีวิธีการที่กำหนดไว้ในArrayListไฟล์. ข้อยกเว้นจะบอกคุณว่าไม่พบวิธีการที่ต้องการ

สร้างไฟล์ ArrayListด้วยเนื้อหาของรายการเก่า

new ArrayList<String>(myList);

43

ลองดูArrayList # addAll (Collection)

ต่อท้ายองค์ประกอบทั้งหมดในคอลเล็กชันที่ระบุไว้ที่ส่วนท้ายของรายการนี้ตามลำดับที่อิลิเมนต์เหล่านั้นส่งคืนโดย Iterator ของคอลเล็กชันที่ระบุ ลักษณะการทำงานของการดำเนินการนี้ไม่ได้กำหนดไว้หากคอลเลกชันที่ระบุถูกแก้ไขในขณะที่การดำเนินการอยู่ระหว่างดำเนินการ (หมายความว่าพฤติกรรมของการเรียกนี้ไม่ได้กำหนดไว้หากคอลเล็กชันที่ระบุเป็นรายการนี้และรายการนี้ไม่ว่างเปล่า)

โดยพื้นฐานแล้วคุณสามารถใช้ได้

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

14

ใน Kotlin List สามารถแปลงเป็น ArrayList ผ่านการส่งเป็นพารามิเตอร์ตัวสร้าง

ArrayList(list)

5

Arrays.asListไม่ได้กลับตัวอย่างของแต่มันกลับเป็นตัวอย่างของjava.util.ArrayListjava.util.Arrays.ArrayList

คุณจะต้องแปลงเป็น ArrayList หากคุณต้องการเข้าถึงArrayListข้อมูลเฉพาะ

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

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.