2011-10-07 4 views
0

Java에서 하드 코딩하지 않고 배열을 초기화 할 수없는 문제가 있습니다.Java에서 하드 코딩하지 않고 배열 크기를 정의하십시오.

int numberOfElements = inputFromFile(args[0], myArray); 
    int [] myArray = new int[1000]; 

inputFromFile 기본적으로 내가 그 내 프로그램과 함께 TEXTFILE에서 numberOfElements을 읽을 수 있습니다 쓸거야 방법이 될 것입니다 :

그래서이 작품 하드 코드 버전입니다.

나는 하드 코딩없이 고정 시도하고이 일 내 결과를 얻었다 :

int numberOfElements = inputFromFile(args[0], myArray); 
    int [] myArray = new int[numberOfElements]; 

문제는 이클립스 날 정수 배열에서 myArray을 초기화하고 싶어 남아 있습니다. 하드 코딩하지 않고 좋은 수정이 있습니까? 어떤 제안이라도 좋을 것입니다.

+1

언어? (나는 Java를 가정하지만, 심지어 그렇다) –

+0

이 질문에 어떤 일이 일어나고 있는지 확실하지 않지만 두 번째 코드 줄에는 어떤 문제가 있습니까? –

답변

2

대신 ArrayList를 사용 하시겠습니까? Java는 C와 마찬가지로 일정한 크기의 배열이 필요합니다.

0

사용하기 전에 어레이를 초기화해야합니다. 당신은 그 사실을 알고 있습니다.

데이터의 크기를 알 수없는 경우 (배열 크기가 얼마나 큰지 알지 못하는 경우) 배열을 내부적으로 사용하고 배열 크기의 재 할당을 관리하는 ArrayList<T>을 사용해야합니다.

배열을 사용해야하는 경우 배열 크기를 직접 유지해야합니다. 배열의 크기가 커질수록 데이터를위한 충분한 공간을 설정하지 않으면 버킷이 부족해질 수 있습니다 : IndexOutOfBoundsException 등등. 그러면 현재 배열의 내용을 새로운 배열 복사로 복사 한 다음 계속해야합니다. 이 모든 것이 ArrayList에서 이루어 지므로 이점이 있습니다. 시간과 구현을 저장합니다. 또한 배열을 확장하는 데 사용되는로드 요소라는 개념이 있습니다.

배열의로드 계수는 일반적으로 배열의 현재 길이에 대해
(j * 3)/2 + 1 // j입니다.

FYI : 데이터가 매우 커지면 배열을 복사하는 것이 매우 비쌉니다. 코드를보고

int numberOfElements = inputFromFile(args[0], myArray); 
int [] myArray = new int[1000]; 

는 문장의 주문이 잘못하고 있어야한다 :

int [] myArray = new int[1000]; 
int numberOfElements = inputFromFile(args[0], myArray); 

당신이 선언하고 초기화하기 전에하는 방법에 myArray의 통과된다.

ArrayList<Integer> s = new ArrayList<Integer>(); 
int numberOfElements = inputFromFile(args[0], myArray); 

이것은 더 좋을 것입니다. 그런 다음 다음과 같이 메소드 서명을 변경해야합니다

public void inputFromFile(String fileName, ArrayList<Integer> collection){ 
// your impl. 
} 
0

을, 그렇지 않으면 myArray을 재 선언하려고합니다. 그 이외의 경우, "하드 코드"를 사용하여 리터럴 값을 사용한다면, 그럴 필요가 없습니다.이들의 작동합니다 : 당신이 생각하는 경우 배열을 원하는

int[] arr4 = {1, 2, 3, 4}; 

: 당신이 사전의 요소를 알고있는 경우

int[] arr1 = new int[5]; 
int size = 10; 
int[] arr2 = new int[size]; 
int sizeLoadedFromFile = loadSizeFrom("/foo/bar/baz"); 
int[] arr3 = new int[sizeLoadedFromFile]; 

참고도 명시 적으로 "크기"인수하지 않고 배열을 선언 할 수 있습니다 하지만 미리의 크기를 모르는, 그런 다음 당신이 정말로 원하는 것은 --probably ListCollection의 일종 자세한 판독 가능

List<Integer> list1 = new ArrayList(); 
list1.add(1); 
list1.add(2); 
list1.add(3); 
list1.add(4); 

또는, 당신은 알고 다시 경우 미리 요소 :

List<Integer> list2 = new ArrayList() {{ 
    add(1); add(2); add(3); add(4); 
}}; 

또는

List<Integer> list3 = Arrays.asList(1, 2, 3, 4, 5); 

Collections Tutorial

당신이 알 필요가 무엇을 말해야한다.

0

나는가 선언되기 전에

1)에서 myArray을 사용하고 있기 때문에 오류를 얻고있다 생각합니다.

2) 함수의 반환 유형 inputFromFile이 int와 일치하지 않습니다.

다음 프로그램이 귀하의 질문에 답변 해 줄 것이라고 생각합니다. 여기에 'getNumber'메소드에 의해 반환 된 값으로 설정되는 int 식별자 'm'이 있습니다. 그런 다음 크기 m의 배열을 선언합니다.

public class Practise { 
    public static void main(String args[]){ 
     int m = getNumber(); 
     int [] a = new int[m]; 

     for(int i = 0; i < m; i++) 
      System.out.println(a[i]); 
    } 
    public static int getNumber(){ 
     Scanner input = new Scanner(System.in); 
     int i = 0; 
     i = input.nextInt(); 

     return i; 
    } 
} 
0
  1. 당신은 명령 줄 인수로 배열의 크기를 제공 할 수 있습니다.
  2. Spring의 Dependency Injection을 사용하는 것도 좋은 방법입니다. 간단한 bean (생성자 주입/설정자 주입)을 작성하는 방법을 알고 싶습니다.
0

List < Integer>를 사용하는 대신 Trove4j TIntArrayList를 사용하는 것이 좋습니다. 이것은 int[]의 랩퍼입니다.

그러나 ArrayList < 정수>는 일반적으로 대부분의 사용 사례에 충분히 빠릅니다.

관련 문제