2011-08-07 3 views
1

나는 사용자가 1-10 사이의 로마 숫자를 입력하고 동등한 10 진수를 출력하는 프로그램을 만들기 위해 숙제를 요청 받았다. 입력에서 문자열을 얻고 출력에서 ​​정수를 얻으므로 구문 분석했지만 작동하지 않습니다. 어떤 아이디어?왜 내 구문 분석이 작동하지 않습니까?

import java.util.Scanner ; 

class Romans { 

    static Scanner s = new Scanner(System.in) ; 
    static String val = null ; 

    public static void main (String [] args) 
    { 
     System.out.print ("Enter a roman numeral between I to X: "); 
     String val = s.nextLine(); 

     int e = Integer.parseInt(val); 
    } 
    static int getRoman (int e) 
    { 
     if (val = "I"){ 
      System.out.print ("1") ; 
     }else if (val = "II"){ 
      System.out.print ("2") ; 
     }else if (val = "III") { 
      System.out.print ("3") ; 
     } else if (val = "IV") { 
      System.out.print ("4") ; 
     } else if (val = "V"){ 
      System.out.print ("5"); 
     } else if (val = "VI") { 
      System.out.print ("6"); 
     } else if (val = "VII") { 
      System.out.print ("7"); 
     } else if (val = "VIII") { 
      System.out.print ("8"); 
     } else if (val = "IX") { 
      System.out.print ("9"); 
     } else if (val = "X") { 
      System.out.print ("10") ; 
     } 
     return val ; 
    } 
} 
+9

힌트 : 문자열 비교를 올바르게 수행하는 방법을 찾으십시오. – Howard

+1

또 다른 힌트 : 같은 오류가 X 번 정도 반복됩니다. –

+0

"작동하지 않음"은 문제에 대한 적절한 설명이 아닙니다. –

답변

4

두 지점 :

  • =는 할당 연산자가 아닌 평등 테스트 연산자입니다 당신은 어쨌든 문자열 어떤지를 테스트하는 ==을 사용하지 말아야합니다 (==)
  • , 그것은 것 같은 참조 용 평등 만 테스트합니다. equals을 사용하여 두 문자열 참조가 같음 (잠재적으로 별개 임) 문자열 객체를 참조하는지 테스트합니다.

또한

+0

어떻게 호출합니까? 미안하지만 여전히 신입생입니다. 감사. :) – Gen

+0

@ 젠 : 방법을 호출하는 법을 배운 적이 없다면 책으로 돌아 가야합니다. 스택 오버플로는 특정 질문에 유용하지만 처음부터 배우는 것이 좋습니다. 다시 말하면, 당신은 단지'Integer.parseInt' 메쏘드를'getRoman'에 대한 호출로 바꿀 수 있습니다 ... –

+0

getRoman (val); getRoman의 서명을 getRoman (String val)으로 변경합니다. 또한 parseInt가 필요하지 않습니다. – stivlo

0

당신이 오류를 얻고있다 ... int, 당신도 getRoman를 호출하지 않는 등의 String 변수를 반환하려는?

코드에서는 절대로 getRoman 함수를 호출하지 않습니다. 또한 예를 들어 비교 연산자 "I".equals (val) 대신 할당 연산자 =를 사용하고 있습니다.

+0

어떻게 호출합니까? 미안하지만 여전히 신입생입니다. 감사. :) – Gen

0

문자열 비교는 == 대신 equals(String str) 메서드로 수행해야합니다. PS. 어쨌든 == 대신 =이 있습니다.

1

문자열을 비교하는 올바른 방법은 equals()를 사용하는 것입니다.

== 사용하려는 기본 유형을 비교하기 위해 할당을 수행하면 String equals 메소드를 비교합니다.

예 :

경우 (val.equals ("I"))

뿐만 아니라 발 메소드 getRoman에는 존재하지 않는다().

1

val을 int로 분석하려고하지만, 그렇지 않은 경우 해당 문자를 구문 분석하려고합니다.

작은 샘플의 문자의 경우 간단히 조회 테이블을 만들고 char에 색인을 생성하는 것이 가장 쉽습니다. 당신이 뭘 원하는지 확실히 하지입니다

val = "I" 

:

0

다음 문은 과제이다.

이중 비교를 사용하여 비교를 수행하지만 이중 같음 (==)은 참조를 비교하지만 여기서도 수행하고 싶지 않습니다.

equals 방법을 사용하고 싶습니다.

if (val.equals("I")) ... 

어디서나 변경하여 어떻게 작동하는지 확인하십시오.

0

실제로 주요 문제는 문자열 비교에서 비롯됩니다. java에서 =는 변수에 값을 할당하기위한 것이고, ==는 기본 유형의 값을 비교하기위한 것이고 equals는 객체, 특히 문자열 비교 방법입니다.

equals를 사용하는 대신 JDK 내부 문자열 풀을 사용할 수도 있습니다.이 경우 ==를 비교 자로 사용할 수 있습니다.

로망 언어 숫자를 구문 분석하는 경우 해시 맵을 사용하여 구문 분석 된 숫자 값을 효과적으로 저장하고 검색하는 것이 좋습니다. 이것을 비교할 수천 개의 비교가 있다면 identityhashmap을 찾으십시오.

마지막으로 모든 로마 숫자에 대해 실제 구문 분석을 수행하려는 경우 첫 번째 것뿐만 아니라 오토마타, 즉 재귀 적 방식으로 숫자를 구문 분석하는 상태 시스템을 고려해야합니다. 귀하의 문제에 적용 할 수있는보다 효율적인 모델입니다.

마지막 2 개의 발언은 소프트웨어 알고리즘에 더 중점을두고 있으며 처음 두 개는 java 구문에 더 중점을 둡니다. 상위 수준 최적화를 수행하기 전에 구문을 알아야합니다.

감사합니다, 스테판을 제외하고 당신의 문자열 비교 등호 (...) 함수를 사용하는 방법에 대한 이상 무슨 말을했는지에서

0

- 예를 들어,

if (val.equals("VII")) 

당신은 또한을 제공해야 getRoman이라는 함수의 반환 값. 이 함수는 호출자에게 정수 값을 반환하는 함수로 선언되었지만 사용자가 제공 한 구현에서는 반환 값이 없습니다 (System.out.println (...) 만 해당).

또한 올바른 매개 변수 유형을 입력하지 않습니다.이 매개 변수 유형은 문자열을 검사하여 특정 로마 숫자인지 확인합니다. 그래서 올바른 기능 헤더는 다음과 같이 보일 것이다 :

public static int getRoman(String val) 

을 또한, 주() 실제로이 함수를 호출하고 있는지 확인 - 그것은 지금의 모습, 당신도 getRoman를 사용하지 않는에서 () 기능.

희망이 도움이됩니다.