[java] 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

당신이 행에 의해 매트릭스 행을 통과 할 수 있도록해야 할 경우, 행지도가 입력 할 수 있습니다 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; }

경고를 피하는 영리한 아이디어입니다. 인터페이스를 사용하는 것이 조금 더 좋습니다.

public interface IntegerNodeList extends List<IntegerNode> {}

그때

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

경고없이 컴파일됩니다.

너무 나쁘게 보이지 않습니까?


답변

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

경고가 없습니다. NetBeans 6.9.1, jdk1.6.0_24


답변

Java 1.5 (또는 내가 말할 수있는 한 1.6)에는 일반적인 배열 생성이 없습니다. https://community.oracle.com/message/4829402를 참조 하십시오 .