2011-12-17 7 views
1

저는 두 가지 자바 관련 문제에 정말로 착수했습니다. 하나는 간단하고 하나는 더 어렵습니다. 2 차원 배열의 생성에 관한자바에서 eval() 파서와 2 차원 배열을 구현하십시오.

,이 같은 테이블을 초기화 :

private String [][] table_of_classifiers = null; 

하고, 함수 내에서,이 같은 내용을 입력 :

 String [][] table_of_classifiers = { 
      {"x1","x","x","x","x"}, 
      {"x2","x","x","x","x"}, 
      {"x3","x","x","x","x"}, 
      {"x4","x","x","x","x"}, 
      {"x5","x","x","x","x"}, 
      {"x6","x","x","x","x"}, 
     }; 

하지만로 첫 번째 테이블을 두 번째 테이블이 (로컬로) 덮어 쓰는 것을 추측 할 수 있습니다. 물론 내가하고 싶은 것은 아닙니다. 내가 뭘 잘못 했니? 표의 크기는 처음부터 알 수 없습니다.

+0

[Java에 eval() 함수가 있습니까?] (http://stackoverflow.com/questions/2605032/is-there-an-eval-function-in-java) – Raedwald

+0

OP가 두 번째 질문을 [새 게시물] (http://stackoverflow.com/questions/8666935/implemention-of-eval-in-java) – Raedwald

답변

0

그냥 수행

class Foo { 
    private String [][] table_of_classifiers = null; 

    void bar() { 
     table_of_classifiers = new String[][] { 
        {"x1","x","x","x","x"}, 
        {"x2","x","x","x","x"}, 
        {"x3","x","x","x","x"}, 
        {"x4","x","x","x","x"}, 
        {"x5","x","x","x","x"}, 
        {"x6","x","x","x","x"}, 
     }; 
    } 
} 

자바 eval (이 컴파일 된 언어이기 때문에)하지 않지만, reflection을 가지고있다. 그것은 당신이하고 싶은 것이 무엇이든지간에 가장 좋은 방법은 아닙니다. 첫 번째 문제에 관해서는

+0

감사합니다! 나는 그 대답을 지킬거야! 좀 더 구체적으로 eval() 솔루션에 대해 제발 할 수 있습니까? – user706838

0

:

 table_of_classifiers = new String[][] { 
      {"x1","x","x","x","x"}, 
      {"x2","x","x","x","x"}, 
      {"x3","x","x","x","x"}, 
      {"x4","x","x","x","x"}, 
      {"x5","x","x","x","x"}, 
      {"x6","x","x","x","x"}, 
     }; 

eval에 관하여 : 쓰기를 재 선언하지 않고 table_of_classifiers에 할당합니다. . . 문제는 런타임에 범위가 지정된 로컬 변수의 이름이 없으며 이 인스턴스 변수의 이름을 가져올 수 있지만 객체 컨텍스트 내에서 수행해야한다는 것입니다. 이런 종류의 문제를 해결할 수는 있지만, 사소한 일이며 큰 타협이 수반 될 것입니다. 어떻게하면 범위 지정이 작동하는지 반사 효과가 어떻게 작용하는지 이해해야한다고 생각합니다. 전에 이 지원할 기능을 파악하기 시작하십시오. 그렇지 않으면 불가능한 것으로 보이는 모든 요구 사항에 실망하게 될 것이기 때문입니다. 2 차원 배열의 생성에 관한

+0

ruakh 감사합니다!그러나 2 단계 구현을 찾고있었습니다. 파서를 만드는 방법을 알려주세요. 보다 컴팩트하고 유지 보수가 쉬운 코드를 만들 수 있기 때문에 그것은 매우 중요합니다! – user706838

+0

@eualin : 자신 만의 파서를 처음부터 작성하는 자신 만의'eval'을 만드는 것은 더 작고 유지 보수가 쉬운 코드를 만들지 않을 것이라고 약속드립니다. 나머지 코드는 더 작아 질 수 있지만 파서 자체는 거대하고 복잡하며 버그가 있습니다. – ruakh

+0

감사합니다. 그럼, 나 한테 추천 할거야? 구체적인 예/접근 방법은 무엇입니까? 나는 우리가 그 문제에 대한 해결책을 찾을 수 없다고 생각한다 ... 나는 그것이 사소한 것이 아니라고 말하고있다. 나는 적어도 위에서 언급 한 요구 사항들을 고려할 때 그렇게 어렵지는 않을 것이라고 말하고있다. – user706838

1

,이 같은 테이블을 초기화 :

private String [][] table_of_classifiers = null; 

정말. 이것은 변수의 초기화 및 선언입니다. 을 가리키고 "2d 배열", "테이블"또는 더 정확하게 "배열 배열"문자열을 가리킬 수 있습니다.

변수가 null 일 수 있다는 사실을 가지고 작업하지 않는 한, null으로 초기화하는 것은 일반적으로 좋지 않습니다. null을 확인하기 위해 추가 작업이 필요하기 때문입니다. 예를 들면 :

String[][] a; 
// ... 
String b = a[0][0]; 

a하지 않는 한 평균 시간이 초기화되지 않았습니다, 컴파일되지 않습니다. 이것은 잠재적 인 버그를 피할 수 있기 때문에 좋은 일입니다.

String[][] a = null; 
// ... 
String b = a[0][0]; 

그러나 이것은 컴파일 할 것이다 것입니다 당신은 실제로 "널 포인터 예외"로 변수에게 실제 배열, 프로그램 것 "충돌"을 지정하는 것을 잊었다하거나 확인하기 위해 추가 코드/일을 추가해야하는 경우 null.

는이 같은 내용을 채우기 : 당신은 여기에 아무것도 "충전"되지

String [][] table_of_classifiers = { 
    {"x1","x","x","x","x"}, 
    {"x2","x","x","x","x"}, 
    {"x3","x","x","x","x"}, 
    {"x4","x","x","x","x"}, 
    {"x5","x","x","x","x"}, 
    {"x6","x","x","x","x"}, 
}; 

. 채워지는 것에 대해서는 먼저 존재해야하지만 아직 아무것도 창조하지 않았습니다.

여기서 동일한 이름의 두 번째 변수를 선언합니다. 첫 번째 변수와 다른 범위에있는 경우에만 가능하며,이 경우 원래 변수를 "숨기거나"("섀도 잉")합니다. if 원래이 새로운 범위에서 액세스 할 수있었습니다. 당신이 (로컬) 첫 하나를 두 번째 테이블 덮어 쓰기를 추측 수

는하지만, 그게 내가하고 싶은 것을하지 물론이다. 내가 뭘 잘못 했니?

"첫 번째"테이블은 무엇입니까? 지금까지는 첫 번째 테이블이 없었으며 첫 번째 변수 만있었습니다. 다른 사람들은 라인의 시작 부분에 "선언"인 String[][]을 사용하지 않고 "테이블"을 원래 변수에 할당하기 위해해야 ​​할 일을 보여주었습니다.

그렇지 않으면 실제로 무엇을 하려는지 설명하지 않았기 때문에 "잘못하고있다"고 말할 수 없습니다.

표의 크기는 처음부터 알 수 없습니다.

아니야? 왜 어떻게/왜 당신은 배열 리터럴을 사용하고 있습니까? 리터럴 배열은 고정 "사전 채우기"로 고정 된 크기의 배열을 만드는 데 사용됩니다.

"처음"은 정확히 무엇을 의미합니까? 프로그래밍 할 때 (컴파일하는 동안) 또는 프로그램을 시작할 때 (런타임에) 크기가 알려지지 않았습니까?

런타임 중에 배열의 크기를 얻을 경우에 당신은 new과 정상적인 배열을 만들 수 있습니다

int a = ...; 
int b = ...; // Get the sizes from somewhere, e.g, user input 

String[][] table_of_classifiers = new String[a][b]; 
// Now you have an "empty" table 

하면 런타임 동안 크기 "변경"다음 - 당신은 실제로 시도하는 내용에 따라 do - 배열이 잘못된 도구이므로 ArrayList과 같이 List 구현을 사용해야합니다.


"eval"에 대해서는 다른 사람들과 마찬가지로 Java는 "eval"을 기본적으로 불가능하게 만드는 컴파일 된 언어입니다. 당신이 암시하는 것을 달성하기 위해 "반영"또는 Class 유형의 사용이 있지만, 실제로 달성하고자하는 것을 훨씬 더 광범위하게 설명 할 필요가 있다면, 여기에서 당신을 도울 수 있습니다.

반사 및 CLass 유형은 복잡한 문제이며, 가장 기본적인 Java 개념으로 분명히 고심하고 있다는 것을 고려하면 원하는 작업을 수행 할 수있을 때까지 갈 길이 멀다.

+0

RoToRa 고맙습니다. 그러나, 너무 많은 세부 사항을 줄 필요가 없었습니다! 그 대답은 당신이 처음 생각한 것보다 훨씬 쉽습니다! – user706838

관련 문제