Java에서 LinkedLists 배열을 만들 수 없습니까?
나는 희소 행렬 클래스에서 일하고 있어요 필요 의 배열을 사용하는 LinkedList
행렬의 값을 저장합니다. 배열의 각 요소 (즉, 각 LinkedList
)는 행렬의 행을 나타냅니다. 그리고 LinkedList
배열의 각 요소 는 열과 저장된 값을 나타냅니다.
내 수업에는 다음과 같이 배열 선언이 있습니다.
private LinkedList<IntegerNode>[] myMatrix;
그리고에 대한 생성자에서 다음 SparseMatrix
을 정의하려고합니다.
myMatrix = new LinkedList<IntegerNode>[numRows];
내가 결국 얻는 오류는
의 일반 배열을 만들 수 없습니다
LinkedList<IntegerNode>
.
그래서 두 가지 문제가 있습니다.
- 내가 뭘 잘못하고 있고
- 배열을 만들 수없는 경우 배열 선언에서 유형이 허용되는 이유는 무엇입니까?
IntegerNode
내가 만든 클래스입니다. 그리고 모든 클래스 파일이 함께 패키지화됩니다.
일반 배열 생성을 사용할 수 없습니다. 그것은 자바 제네릭의 결함 / 특징입니다.
경고가없는 방법은 다음과 같습니다.
목록 배열 대신 목록 목록 사용 :
List< List<IntegerNode>> nodeLists = new LinkedList< List< IntegerNode >>();
목록 배열에 대한 특수 클래스 선언 :
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
'programing' 카테고리의 다른 글
Android java.lang.VerifyError? (0) | 2020.08.21 |
---|---|
NSData를 16 진수 문자열로 직렬화하는 가장 좋은 방법 (0) | 2020.08.21 |
VC ++에서 헤더와 소스 파일 사이를 이동할 수있는 바로 가기가 있습니까? (0) | 2020.08.20 |
과거 커밋을 어떻게 쉽게 수정할 수 있습니까? (0) | 2020.08.20 |
jQuery를 사용하여 div에 특정 클래스의 자식이 있는지 확인 (0) | 2020.08.20 |