2

나는 오픈 그린 안드로이드 게임을위한 OBJ 수입업자를 만드는 과정에있다. 나는 자바 언어에 비교적 익숙하지 않기 때문에 몇 가지 점에 대해서는 명확하지 않다.Java에서 초기화되지 않은 배열 채우기? (또는 회피!)

float vertices[]; 

문제는 내가 거기에 얼마나 많은 정점 모르겠입니다 :

나는 (물론 약간 다른 배열과 함께) 모델의 꼭지점의 수를 개최한다 배열이 모델에서 전에 주어진 inputstream을 사용하여 파일을 읽습니다. 나는이

vertices[95] = 5.004f; //vertices was defined like the example above 

? : 좋아 할 필요가 또는 내가 미리 초기화해야하는 것처럼

나는 그것을 채울 수 있을까?

후자의 경우 파일의 정점 수를 찾는 좋은 방법은 무엇입니까? 일단 inputstreamreader.read()를 사용하여이 파일을 읽으면 전체 파일을 읽을 때까지 다음 줄로갑니다. 내가 생각할 수있는 유일한 방법은 전체 파일을 읽고 정점의 수를 계산 한 다음 다시 초기화 된 배열에서 채우기를 다시 읽는 것입니다.

필요에 따라 동적으로 데이터를 할당하는 방법이 있습니까?

답변

6

필요한 동적 크기를 제공하는 ArrayList를 사용할 수 있습니다.

vertices.add(5.0F); 

및 목록은 사용자의 요구에 맞게 성장할 것입니다 :

List<Float> vertices = new ArrayList<Float>(); 

이 같은 값을 추가 할 수 있습니다.

참고 사항 : ArrayList는 기본 유형이 아닌 객체를 보유합니다. 따라서 Float 객체로 제공 한 float 값을 저장합니다. 그러나, 이것으로부터 원래의 float 값을 얻는 것은 쉽습니다.

배열이 절대적으로 필요한 경우 전체 값 목록을 읽은 다음 목록에서 쉽게 배열을 가져올 수 있습니다.

Java Collections here에 대한 정보를 읽을 수 있습니다.

0

아니요, 초기화되지 않은 배열을 채울 수 없습니다. 는 (귀하의 경우 중요한 것 같다) 데이터 + 인덱스를 저장 할 수있는 동적 구조가 필요하면, 내가지도에 갈 것이다 (지도의 핵심이 될 것이다 색인) : 자바 배열에서

Map<Integer, Float> vertices = new HashMap<Integer, Float>(); 
vertices.put(95, 5.004f); 
1

가지고 미리 초기화해야한다. 귀하의 경우에는 다음과 같은 옵션이 있습니다 :

1) ArrayList (또는 List 인터페이스 구현)을 다른 사람이 제안한대로 사용하십시오. 이러한 목록은 동적으로 커질 수 있으므로 도움이됩니다.

2) 파일 형식을 제어 할 수있는 경우 정점 수에 대한 정보를 파일의 시작 부분에 추가하여 올바른 크기로 배열을 미리 초기화 할 수 있습니다.

3) 제어 할 수없는 경우 파일 크기에 따라 정점 수를 추측 해보십시오 (예 : float은 4 바이트이므로 File.length()을 4로 나눌 수 있습니다). 추측 된 숫자가 너무 작 으면 더 큰 배열 (예 : 이전 배열 크기의 120 %)을 동적으로 만들 수 있으며, 이전 배열의 모든 데이터를 새 배열에 복사하고 계속 수행 할 수 있습니다. 이것은 비용이 많이 들지만 배열 크기에 대한 추측이 정확하면 문제가되지 않습니다.

파일 형식 및/또는이 정점 배열을 사용하는 방법에 대해 더 많은 정보를 제공하면 아이디어를 더 많이 제공 할 수 있습니다 (예 : 오랜 시간 동안 저장했거나 빠르게 버려짐).

관련 문제