ฉันต้องการสร้างอาร์เรย์ของรายการอาร์เรย์ดังนี้:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
แต่มันไม่ได้รวบรวม ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันต้องการสร้างอาร์เรย์ของรายการอาร์เรย์ดังนี้:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
แต่มันไม่ได้รวบรวม ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ตามเอกสารของ Oracle :
"คุณไม่สามารถสร้างอาร์เรย์ของพารามิเตอร์ชนิด"
คุณสามารถทำได้:
ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
ตามที่แนะนำโดย Tom Hawting - tackline จะดียิ่งกว่า:
List<List<Individual>> group = new ArrayList<List<Individual>>(4);
List<List<Individual>> group = new ArrayList<List<Individual>>();
น่าจะดีกว่า
อย่างที่คนอื่น ๆ พูดถึงมันอาจจะดีกว่าถ้าใช้รายการอื่นเพื่อเก็บ ArrayList ไว้ แต่ถ้าคุณต้องใช้อาเรย์:
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
ArrayList<String>[] group = new ArrayList[4]
) นักแสดงที่ดีคนพิเศษทำอะไรได้บ้าง?
new ArrayList<?>[N]
เพื่อหลีกเลี่ยงการใช้ประเภทดิบ
งานนี้:
ArrayList<String>[] group = new ArrayList[4];
ArrayList<String>
แทนArrayList<NotString>
) เพื่อgroup
ไม่คอมไพล์
Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
คุณสามารถสร้างคลาสที่ขยาย ArrayList ได้
class IndividualList extends ArrayList<Individual> {
}
แล้วสร้างอาร์เรย์
IndividualList[] group = new IndividualList[10];
ฉันไม่เข้าใจเลยว่าทำไมทุกคนถึงแนะนำประเภท Genric ให้กับอาร์เรย์โดยเฉพาะสำหรับคำถามนี้
จะทำอย่างไรถ้าความต้องการของฉันคือการจัดทำดัชนีรายการn
array ต่างๆ
ด้วยการประกาศว่าList<List<Integer>>
ฉันต้องสร้างn
ArrayList<Integer>
วัตถุด้วยตนเองหรือใส่วนรอบเพื่อสร้างn
รายการหรือวิธีอื่น ๆ ไม่ว่าในทางใดมันจะเป็นหน้าที่ของฉันในการสร้างn
รายการ
List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
มันจะไม่ดีถ้าเราประกาศว่าผ่านการหล่อเป็น ฉันเห็นว่ามันเป็นการออกแบบที่ดีโดยที่ไม่ต้องสร้างวัตถุการทำดัชนีทั้งหมด (arraylist) ด้วยตัวเอง
ทุกคนสามารถให้ความกระจ่างแก่ฉันได้ไหมว่าทำไม (รูปแบบนี้) จะเป็นการออกแบบที่ไม่ดีและข้อเสียของมันคืออะไร?
คุณสามารถสร้าง Array of ArrayList
List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
outer[i] = new ArrayList<>();
}
สิ่งนี้จะเป็นประโยชน์ในสถานการณ์เช่นนี้ คุณรู้ขนาดของด้านนอก แต่ขนาดของวัตถุภายในนั้นแตกต่างกันไป ที่นี่คุณสามารถสร้างอาร์เรย์ของความยาวคงที่ซึ่งมีรายการอาร์เรย์ที่มีขนาดต่างกัน หวังว่านี่จะเป็นประโยชน์สำหรับคุณ
ในJava 8ขึ้นไปคุณสามารถทำได้ด้วยวิธีที่ดีกว่ามาก
List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());
ดียิ่งขึ้นโดยใช้การอ้างอิงวิธีการ
List<Integer>[] outer = new List[10];
Arrays.setAll(outer, ArrayList :: new);
ArrayList::new
มันจะเรียกตัวArrayList(int)
สร้างที่มีดัชนีปัจจุบันเป็นอาร์กิวเมนต์ - ArrayList (1), ArrayList (2), ArrayList (3) เป็นต้นดังนั้นคุณจะจบลงด้วยอาร์เรย์ที่มีขนาดเล็กกว่าหรือใหญ่กว่า ขึ้นอยู่กับการใช้งานของคุณ ฉันจะกีดกันการใช้มันและแทนที่จะชอบวิธีที่สองที่คุณเรียกนวกรรมิกของตัวเองในการแสดงออกแลมบ์ดาของคุณ
งานนี้อาร์เรย์ของ ArrayList ให้มันลองเพื่อทำความเข้าใจวิธีการทำงาน
import java.util.*;
public class ArrayOfArrayList {
public static void main(String[] args) {
// Put the length of the array you need
ArrayList<String>[] group = new ArrayList[15];
for (int x = 0; x < group.length; x++) {
group[x] = new ArrayList<>();
}
//Add some thing to first array
group[0].add("Some");
group[0].add("Code");
//Add some thing to Secondarray
group[1].add("In here");
//Try to output 'em
System.out.println(group[0]);
System.out.println(group[1]);
}
}
ให้เครดิตแก่ Kelvincer สำหรับรหัสบางส่วน
ปัญหาเกี่ยวกับสถานการณ์นี้คือการใช้ arraylist คุณจะได้รับเวลาที่ซับซ้อนของ o (n) สำหรับการเพิ่มที่ตำแหน่งเฉพาะ ถ้าคุณใช้อาร์เรย์คุณสร้างตำแหน่งหน่วยความจำโดยการประกาศอาร์เรย์ของคุณดังนั้นมันจึงเป็นค่าคงที่
คุณไม่สามารถสร้างอาร์เรย์ประเภททั่วไปได้ สร้างรายชื่อ ArrayLists:
List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();
หรือถ้าคุณต้องการอาร์เรย์จริงๆ (คำเตือน: การออกแบบที่ไม่ดี!):
ArrayList[] group = new ArrayList[4];
การสร้างและการเริ่มต้น
Object[] yourArray = new Object[ARRAY_LENGTH];
เข้าถึงการเขียน
yourArray[i]= someArrayList;
เพื่อเข้าถึงองค์ประกอบของ ArrayList ภายใน:
((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
การเข้าถึงเพื่ออ่าน
การอ่านองค์ประกอบอาร์เรย์ฉันเป็นแบบหล่อใช้ ArrayList:
someElement= (ArrayList<YourType>) yourArray[i];
สำหรับองค์ประกอบอาร์เรย์ i: เพื่ออ่านองค์ประกอบ ArrayList ที่ดัชนี j
arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);
List [] listArr = new ArrayList [4];
บรรทัดด้านบนให้คำเตือน แต่ใช้งานได้ (เช่นสร้าง Array of ArrayList)
ในการประกาศอาร์เรย์ของ ArrayLists แบบคงที่เพื่อให้พูดวางตำแหน่งเป็นคะแนน:
ArrayList<Point>[] positionList = new ArrayList[2];
public Main(---) {
positionList[0] = new ArrayList<Point>(); // Important, or you will get a NullPointerException at runtime
positionList[1] = new ArrayList<Point>();
}
แบบไดนามิก:
ArrayList<Point>[] positionList;
int numberOfLists;
public Main(---) {
numberOfLists = 2;
positionList = new ArrayList[numberOfLists];
for(int i = 0; i < numberOfLists; i++) {
positionList[i] = new ArrayList<Point>();
}
}
แม้จะมีข้อควรระวังและคำแนะนำที่ซับซ้อนบางอย่างที่นี่ แต่ฉันได้พบ ArrayLists หลายชุดเพื่อเป็นโซลูชันที่หรูหราในการเป็นตัวแทนของ ArrayLists ที่เกี่ยวข้องในประเภทเดียวกัน
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10];
คุณสามารถสร้างเช่นนี้
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
คุณต้องสร้างอาเรย์ประเภทที่ไม่ใช่ประเภททั่วไปแล้วจึงแปลงเป็นประเภททั่วไป
ArrayList<Integer>[] graph = new ArrayList[numCourses]
มันได้ผล.
ฉันคิดว่ามันใช้ง่ายกว่านี้ ...
static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
group=new ArrayList[size];
for(int i=0;i<size;i++)
{
group[i]=new ArrayList<Individual>();
}
คุณสามารถทำได้:
// สร้างอาเรย์ประเภท ArrayList
`ArrayList<Integer>[] a = new ArrayList[n];`
// สำหรับแต่ละองค์ประกอบในอาร์เรย์ให้สร้าง ArrayList
for(int i=0; i<n; i++){
a[i] = new ArrayList<Integer>();
}
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
al[i] = new ArrayList<String>();
}
คุณสามารถสร้างรายการ [] และเริ่มต้นพวกเขาโดยสำหรับวง มันรวบรวมโดยไม่มีข้อผิดพลาด:
List<e>[] l;
for(int i = 0; i < l.length; i++){
l[i] = new ArrayList<e>();
}
มันทำงานร่วมกับ arrayList [] l เช่นกัน
l.length
ไม่ได้กำหนดใน for-loop นี่อาจเป็นข้อผิดพลาดรันไทม์