Tạo một mảng các danh sách


175

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?


8
Đừng trộn mảng và bộ sưu tập. Thực tế, không sử dụng mảng trừ khi bạn đang xử lý các nguyên thủy (hoặc bạn biết bạn đang làm gì). Mảng là một cơn ác mộng về khả năng sử dụng, chúng làm cho mã của bạn không thể nhận ra.
Sean Patrick Floyd

13
@SeanPatrickFloyd Bạn có thể giải thích tại sao mảng là cơn ác mộng về khả năng sử dụng?
người dùng

3
@crucifiedsoul chắc chắn. một mảng không thể phát triển, bạn không thể chèn bất cứ thứ gì vào một mảng, một mảng không ghi đè các phương thức tiêu chuẩn như bằng mã băm hoặc toString, v.v.
Sean Patrick Floyd

9
@SeanPatrickFloyd ổn - tôi cần chính xác bốn danh sách mảng - Tôi dự định truy cập từng danh sách theo chỉ mục - Tôi không cần mảng bên ngoài để tăng hoặc thu hẹp - Tôi không cần bất kỳ toString hoặc hashcode nào, v.v. - - với tôi, một mảng là sự lựa chọn rõ ràng ở đây - bạn muốn đề xuất gì thay thế trong tình huống này?
BrainSlugs83 14/03/2015

4
Được rồi, đây là một câu hỏi cũ nhưng dù sao tôi cũng sẽ hỏi và xem có ai trả lời không. Tôi đang thấy mọi người nói về lý do tại sao một mảng danh sách là một ý tưởng tồi tệ, thực hành mã hóa tồi tệ, v.v. Tôi đã tìm kiếm điều này bởi vì tôi đang học cách thực hiện chuỗi băm và định nghĩa về chuỗi băm là một mảng danh sách! Vì vậy, làm thế nào chính xác một cấu trúc dữ liệu lập trình trung tâm có thể là thực hành mã hóa khủng khiếp? Hay điều này chỉ rơi vào danh mục IYKWYD được đề cập bởi @Sean?
jimboweb

Câu trả lời:


142

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);

20
List<List<Individual>> group = new ArrayList<List<Individual>>();có lẽ sẽ tốt hơn
Tom Hawtin - tackline

4
"Không thể tạo một mảng kiểu chung" nghĩa là gì? Điều đó không thực sự có ý nghĩa với tôi bởi vì nó không phải là chung chung nếu bạn cung cấp những gì nó giả sử, phải không?
Andy

5
Tôi ngạc nhiên về các upvote vì nó không trả lời câu hỏi (tức là tôi muốn làm điều này, làm thế nào tôi có thể làm điều đó). Ngoại trừ có thể cho câu đầu tiên.
Florian F

15
Tại sao danh sách tham chiếu tốt hơn ArrayList?
shifu

3
@shifu một tham chiếu Danh sách tổng quát hơn ArrayList; khai báo dưới dạng Danh sách trừu tượng hóa API của ArrayList mở rộng ra ngoài API Danh sách. Điều đó là tốt vì nó đơn giản hóa việc tham chiếu đến Danh sách mà API có thể có toàn bộ những gì Danh sách cần thiết cho mọi cách, mà không làm lộn xộn API tham chiếu đó với ArrayList bổ sung. Bạn chỉ nên khai báo là ArrayList nếu bạn cần một cái gì đó cụ thể từ API của nó để có sẵn thông qua tham chiếu.
cellepo

98

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];

4
Không ai có thể giải thích tốt tại sao và tôi thích đoạn trích của bạn ở trên. Tại sao bạn khuyên bạn nên sử dụng danh sách này?
clankill3r

3
Nếu nhóm mảng không thay đổi, thì cách tiếp cận này tốt hơn, vì các mảng nhanh hơn các lớp List <>.
Borzh

33
Cảm ơn vì đã thực sự trả lời câu hỏi. Không có lý do hợp lý để tự động cho rằng một danh sách thích hợp hơn với một mảng mà không có ngữ cảnh xa hơn.
Sốt đặc biệt

3
Bất kỳ lý do nào điều này sẽ được ưa thích hơn @kelvincer Trả lời ( ArrayList<String>[] group = new ArrayList[4])? Những gì tốt hơn doe sthe diễn viên làm gì?
cellepo

2
Bạn nên sử dụng new ArrayList<?>[N]để tránh sử dụng một loại thô.
Radiodef

80

Những công việc này:

ArrayList<String>[] group = new ArrayList[4];

1
Điều này thỏa mãn có lợi ích mong muốn là thêm một ArrayList của bất kỳ Đối tượng nào ngoài Chuỗi (tức là: ArrayList<String>thay vì ArrayList<NotString>) để groupkhông biên dịch
cellepo 22/03/2016

12
Điều này tạo ra một cảnh báo:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
toán

24

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];

17

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 ncá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 ndanh 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 ndanh 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ì?


AFAICT dường như là một loại tâm lý sùng bái hàng hóa được gây ra bởi hệ thống đánh máy khủng khiếp mà Java mang đến cho bàn.
BrainSlugs83 14/03/2015

@smsIce: Nó không phải là một thiết kế tồi. Vấn đề là, nhiều nhà văn không đọc toàn bộ câu hỏi hoặc hiểu nó rõ ràng.
testo

16

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);

2
Khi bạn sử dụng 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.
Genhis

8

Đ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ã.


6

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


Thêm vào một vị trí cụ thể là O (n) cho cả mảng và ArrayList. Điền cũng là O (n) cho cả mảng và ArrayList.
Navin

2
Thêm vào một vị trí cụ thể là O (1) cho mảng. Đó là O (n) cho ArrayList, nhưng O (1) cho mảng.
từ

3

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];

2
  1. Tạo và khởi tạo

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. 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
  3. Đọ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);

2

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)


1

Để 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.


1
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10]; 

1

Bạn có thể tạo như thế này ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

Bạn phải tạo một mảng kiểu không chung chung và sau đó chuyển nó thành kiểu chung.


1

ArrayList<Integer>[] graph = new ArrayList[numCourses] Nó hoạt động.


0

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>();
 }

0

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>();
}

0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}

-1

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.


2
l.lengthkhông được xác định trong vòng lặp for. Đây có thể là một lỗi thời gian chạy.
bourbaki4481472

Tôi không được khởi tạo để có độ dài, nó vẫn là con trỏ null khi đến vòng lặp for. tức là Danh sách <e> [] l = Danh sách mới [LENGTH];
Erik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.