programing

Java에서 LinkedLists 배열을 만들 수 없습니까?

nasanasas 2020. 8. 20. 18:58
반응형

Java에서 LinkedLists 배열을 만들 수 없습니까?


나는 희소 행렬 클래스에서 일하고 있어요 필요 의 배열을 사용하는 LinkedList행렬의 값을 저장합니다. 배열의 각 요소 (즉, 각 LinkedList)는 행렬의 행을 나타냅니다. 그리고 LinkedList배열의 각 요소 는 열과 저장된 값을 나타냅니다.

내 수업에는 다음과 같이 배열 선언이 있습니다.

private LinkedList<IntegerNode>[] myMatrix;

그리고에 대한 생성자에서 다음 SparseMatrix을 정의하려고합니다.

myMatrix = new LinkedList<IntegerNode>[numRows];

내가 결국 얻는 오류는

의 일반 배열을 만들 수 없습니다 LinkedList<IntegerNode>.

그래서 두 가지 문제가 있습니다.

  1. 내가 뭘 잘못하고 있고
  2. 배열을 만들 수없는 경우 배열 선언에서 유형이 허용되는 이유는 무엇입니까?

IntegerNode내가 만든 클래스입니다. 그리고 모든 클래스 파일이 함께 패키지화됩니다.


일반 배열 생성을 사용할 수 없습니다. 그것은 자바 제네릭의 결함 / 특징입니다.

경고가없는 방법은 다음과 같습니다.

  1. 목록 배열 대신 목록 목록 사용 :

    List< List<IntegerNode>> nodeLists = new LinkedList< List< IntegerNode >>();
    
  2. 목록 배열에 대한 특수 클래스 선언 :

    class IntegerNodeList {
        private final List< IntegerNode > nodes;
    }
    

어떤 이유로 유형을 캐스팅하고 다음과 같이 선언해야합니다.

myMatrix = (LinkedList<IntegerNode>[]) new LinkedList<?>[numRows];

구문 문제를 제외하고는 배열과 연결 목록을 사용하여 행렬을 나타내는 것이 이상하게 보입니다. 행렬의 액세스 임의의 세포 수 있으려면, 당신은 실제 배열을 원하는 아마 것 또는 적어도이 ArrayList같은 행을 유지하기 위해 LinkedList특정 소자,에 첫 번째 요소에 전체 목록을 통과해야한다 O(n)작동 훨씬 반대로, 빨리 O(1)함께 ArrayList또는 실제 어레이.

이 행렬이 희소하다고 언급 했으므로 데이터를 저장하는 더 좋은 방법은 맵 맵으로, 첫 번째 맵의 키는 행 인덱스를 나타내고 그 값은 키가 열 인덱스 인 행 맵입니다. , 값은 IntegerNode 클래스입니다. 그러므로:

private Map<Integer, Map<Integer, IntegerNode>> myMatrix = new HashMap<Integer, Map<Integer, IntegerNode>>();

// access a matrix cell:
int rowIdx = 100;
int colIdx = 30;
Map<Integer, IntegerNode> row = myMatrix.get(rowIdx); // if null, create and add to matrix
IntegerNode node = row.get(colIdx); // possibly null

행 단위로 행렬을 순회 할 수 있어야하는 경우 행 맵 유형을 a TreeMap로 만들고 인덱스 순서로 열을 순회하는 데 동일 하게 만들 수 있지만 이러한 경우가 필요하지 않으면 HashMap보다 빠릅니다 TreeMap. 물론 임의의 셀을 가져오고 설정하고 설정되지 않은 null 값을 처리하는 도우미 메서드가 유용합니다.


class IntegerNodeList extends LinkedList<IntegerNode> {}

IntegerNodeList[] myMatrix = new IntegerNodeList[numRows]; 

myMatrix = (LinkedList<IntegerNode>[]) new LinkedList[numRows];

이 방식으로 캐스팅하면 작동하지만 여전히 불쾌한 경고가 남습니다.

"형식 안전성 : 형식 List []의 표현은 체크되지 않은 변환이 필요합니다."

목록 배열에 대한 특수 클래스 선언 :

class IntegerNodeList { private final List< IntegerNode > nodes; }

is a clever idea to avoid the warning. maybe a little bit nicer is to use an interface for it:

public interface IntegerNodeList extends List<IntegerNode> {}

then

List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];

compiles without warnings.

doesn't look too bad, does it?


List<String>[] lst = new List[2];
lst[0] = new LinkedList<String>();
lst[1] = new LinkedList<String>();

No any warnings. NetBeans 6.9.1, jdk1.6.0_24


There is no generic array creation in Java 1.5 (or 1.6 as far as I can tell). See https://community.oracle.com/message/4829402.


If I do the following I get the error message in question

LinkedList<Node>[] matrix = new LinkedList<Node>[5];

But if I just remove the list type in the declaration it seems to have the desired functionality.

LinkedList<Node>[] matrix = new LinkedList[5];

Are these two declarations drastically different in a way of which I'm not aware?

EDIT

Ah, I think I've run into this issue now.

Iterating over the matrix and initializing the lists in a for-loop seems to work. Though it's not as ideal as some of the other solutions offered up.

for(int i=0; i < matrix.length; i++){

    matrix[i] = new LinkedList<>();
}

You need an array of List, one alternative is to try:

private IntegerNode[] node_array = new IntegerNode[sizeOfYourChoice];

Then node_array[i] stores the head(first) node of a ArrayList<IntegerNode> or LinkedList<IntegerNode> (whatever your favourite list implementation).

Under this design, you lose the random access method list.get(index), but then you could still traverse the list starting with the head/fist node store in the type safe array.

This might be an acceptable design choice depending on your use case. For instance, I use this design to represent an adjacency list of graph, in most use cases, it requires traversing the adjacency list anyway for a given vertex instead of random access some vertex in the list.

참고URL : https://stackoverflow.com/questions/217065/cannot-create-an-array-of-linkedlists-in-java

반응형