Tôi muốn tạo một mảng danh sách mảng như dưới đây:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Nhưng nó không được biên dịch. Tôi có thể làm cái này như thế nào?
Tôi muốn tạo một mảng danh sách mảng như dưới đây:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Nhưng nó không được biên dịch. Tôi có thể làm cái này như thế nào?
Câu trả lời:
Theo Tài liệu Oracle :
"Bạn không thể tạo mảng các loại tham số"
Thay vào đó, bạn có thể làm:
ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
Theo đề xuất của Tom Hawting - tackline, thậm chí còn tốt hơn để làm:
List<List<Individual>> group = new ArrayList<List<Individual>>(4);
List<List<Individual>> group = new ArrayList<List<Individual>>();
có lẽ sẽ tốt hơn
Như những người khác đã đề cập, có lẽ tốt hơn là sử dụng một danh sách khác để lưu ArrayList vào nhưng nếu bạn phải sử dụng một mảng:
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
ArrayList<String>[] group = new ArrayList[4]
)? Những gì tốt hơn doe sthe diễn viên làm gì?
new ArrayList<?>[N]
để tránh sử dụng một loại thô.
Những công việc này:
ArrayList<String>[] group = new ArrayList[4];
ArrayList<String>
thay vì ArrayList<NotString>
) để group
không biên dịch
Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Bạn có thể tạo một lớp mở rộng ArrayList
class IndividualList extends ArrayList<Individual> {
}
và sau đó tạo mảng
IndividualList[] group = new IndividualList[10];
Tôi hoàn toàn không hiểu điều đó, tại sao mọi người lại gợi ý kiểu gen qua mảng đặc biệt cho câu hỏi này.
Điều gì sẽ xảy ra nếu nhu cầu của tôi là lập chỉ mục n
các danh sách mảng khác nhau.
Với việc khai báo, List<List<Integer>>
tôi cần tạo n
ArrayList<Integer>
các đối tượng theo cách thủ công hoặc đặt một vòng lặp for để tạo n
danh sách hoặc một số cách khác, theo bất kỳ cách nào, nhiệm vụ của tôi là luôn tạo ra n
danh sách.
Thật tuyệt vời phải không nếu chúng ta tuyên bố nó thông qua việc đúc như List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Tôi thấy nó là một thiết kế tốt khi người ta không phải tự tạo tất cả các đối tượng lập chỉ mục (danh sách mảng)
Bất cứ ai có thể khai sáng cho tôi tại sao điều này (dạng mảng) sẽ là một thiết kế xấu và nhược điểm của nó là gì?
Bạn có thể tạo Array of ArrayList
List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
outer[i] = new ArrayList<>();
}
Điều này sẽ hữu ích trong các tình huống như thế này. Bạn biết kích thước của cái bên ngoài. Nhưng kích thước của những cái bên trong khác nhau. Tại đây, bạn có thể tạo một mảng có độ dài cố định chứa danh sách Mảng thay đổi kích thước. Hy vọng điều này sẽ hữu ích cho bạn.
Trong Java 8 trở lên, bạn có thể làm điều đó theo cách tốt hơn nhiều.
List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());
Thậm chí tốt hơn bằng cách sử dụng tham chiếu phương pháp
List<Integer>[] outer = new List[10];
Arrays.setAll(outer, ArrayList :: new);
ArrayList::new
, nó sẽ gọi bộ điều khiển ArrayList(int)
với chỉ mục hiện tại là đối số - ArrayList (1), ArrayList (2), ArrayList (3), v.v. Vì vậy, bạn sẽ kết thúc với các mảng có kích thước nhỏ hoặc quá cỡ, tùy thuộc vào cách sử dụng của bạn. Tôi sẽ không khuyến khích sử dụng nó và thay vào đó thích cách tiếp cận thứ hai nơi bạn tự gọi hàm tạo trong biểu thức lambda của bạn.
Điều này hoạt động, mảng của ArrayList. Hãy thử để hiểu làm thế nào nó hoạt động.
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]);
}
}
Tín dụng cho Kelvincer cho một số mã.
Vấn đề với tình huống này là bằng cách sử dụng một danh sách mảng, bạn có được độ phức tạp thời gian là o (n) để thêm vào một vị trí cụ thể. Nếu bạn sử dụng một mảng, bạn tạo một vị trí bộ nhớ bằng cách khai báo mảng của mình do đó nó không đổi
Bạn không thể tạo mảng kiểu chung. Tạo danh sách các ArrayLists:
List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();
hoặc nếu bạn THỰC SỰ cần mảng (CẢNH BÁO: thiết kế xấu!):
ArrayList[] group = new ArrayList[4];
Tạo và khởi tạo
Object[] yourArray = new Object[ARRAY_LENGTH];
Ghi truy cập
yourArray[i]= someArrayList;
để truy cập các phần tử của ArrayList nội bộ:
((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
Đọc quyền truy cập
để đọc phần tử mảng i dưới dạng ArrayList, sử dụng kiểu truyền:
someElement= (ArrayList<YourType>) yourArray[i];
đối với phần tử mảng i: để đọc phần tử ArrayList tại chỉ mục j
arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);
Danh sách [] listArr = new ArrayList [4];
Dòng trên đưa ra cảnh báo, nhưng nó hoạt động (tức là nó tạo Array of ArrayList)
Để khai báo một mảng ArrayLists tĩnh, giả sử, hãy viết các vị trí dưới dạng Điểm:
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>();
}
năng động:
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>();
}
}
Bất chấp những cảnh báo và một số gợi ý phức tạp ở đây, tôi đã tìm thấy một mảng ArrayLists là một giải pháp tao nhã để đại diện cho ArrayLists liên quan cùng loại.
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Nó hoạt động.
Tôi thấy điều này dễ sử dụng hơn ...
static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
group=new ArrayList[size];
for(int i=0;i<size;i++)
{
group[i]=new ArrayList<Individual>();
}
Bạn có thể làm được việc này :
// Tạo một mảng kiểu ArrayList
`ArrayList<Integer>[] a = new ArrayList[n];`
// Với mỗi phần tử trong mảng, tạo một 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>();
}
bạn có thể tạo Danh sách [] và khởi tạo chúng bằng vòng lặp. nó biên dịch không có lỗi:
List<e>[] l;
for(int i = 0; i < l.length; i++){
l[i] = new ArrayList<e>();
}
nó cũng hoạt động với mảngList [] l.
l.length
không được xác định trong vòng lặp for. Đây có thể là một lỗi thời gian chạy.