2016-03-16 1 views
1

EDIT: Право, я забыл сформулировать проблему - это тот факт, что я получаю 0 в качестве вывода.Преобразуйте числовое слово (String) в его целое значение

КОНТЕКСТ

Моя программа стремится занять пользователем введенный номер-слово (1- 99) и вывод его в виде целого числа (то есть тридцать четыре = 34). Я не могу понять, где ошибка в моем коде, и нужна помощь:

Scanner scInput = new Scanner(System.in); 
String word = scInput.nextLine(); //number in word-form (i.e. twenty six) 

char[] charArray = word.toCharArray();//string to char array for word^ 
int divider = 0; //position of hyphen/space in charArray 

Всех 2-слово номер состоит из десятков дорожит & значения из них. Предполагая правильный синтаксис [english], слово перед дефисом/пробелом divider - это десятки, а следующее слово - divider.

МАССИВЫ

//word values - components & syntax (1-99) 

//ONES 
public static final String[] wONES = {"one","two","three","four","five","six","seven","eight","nine"}; 

//TENS 
public static final String[] wTENS = {null,"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"}; 

//TEENS 
public static final String[] wTEENS = {"ten", "eleven", "twelve", "thirteen","fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; 

Я организовал все слова-компоненты в 3-х различных массивов: единицы, десятки и подростков.

//equivalent integer-array of above String arrays 

//ONES 
public static final int[] nONES = {1,2,3,4,5,6,7,8,9}; 

//TENS 
public static final int[] nTENS = {0,20,30,40,50,60,70,80,90}; 

//TEENS 
public static final int[] nTEENS = {10,11,12,13,14,15,16,17,18,19}; 

Я создал 3 другие массивы, которые являются такими же, как выше трех массивов, за исключением того, что они хранят целые значения.

КОД

Здесь отрывает пользователь вводятся строки на две секции: десятки и те. Поэтому, если число равно 72: 70 = десятки и 2 = единицы.

int tensValue = 0; //number's tens value (i.e. 30) 
int onesValue = 0; //ones value (i.e. 3) 

     char[] tensArray = null; //array storing tens section of word (before divider) 
     for (int u = 0; u < divider; u++){ 
      tensArray[u] = charArray[u]; 
     } 
     String tens = new String(tensArray); //convert char array to String 


     char[] onesArray = null; //array storing ones section of word (after divider) 
     for (int u = divider + 1; u > divider && u < charArray.length; u++){ 
      onesArray[u] = charArray[u]; 
     } 
     String ones = new String(onesArray); 

     //searches for matches in String array for tens 
     for(int u = 0; u < wTENS.length; u++){ 
      if(tens.equals(wTENS[u])){ 
       tensValue = nTENS[u]; 
       total += tensValue; 

      } 
     } 

     //searches for matches in String array for ones 
     for(int u = 0; u < wONES.length; u++){ 
      if(ones.equals(wONES[u])){ 
       onesValue = nONES[u]; 
       total += onesValue; 
+2

И проблема? – Guy

+0

Ну для начала 'char [] tensArray = null;' должно быть что-то вроде 'char [] tensArray = new char [10];' – user2004685

ответ

1

У вас есть интересный подход к этой проблеме.Несколько вещей, которые нужно изменить:

  1. Я не вижу, где вы указываете свой делитель.

  2. Вы, кажется, много работаете с массивами символов, поэтому я предполагаю, что вы исходите с другого языка. Приклеивание струн будет работать нормально.

  3. Вы не обращаетесь к «подросткам». Это похоже на простой надзор.

Я добавил эти исправления при попытке сохранить оригинальный подход:

public static void main(String [] args) { 

    Scanner scInput = new Scanner(System.in); 
    String word = scInput.nextLine(); 

    int total = 0; 
    int tensValue = 0; //number's tens value (i.e. 30) 
    int onesValue = 0; //ones value (i.e. 3) 

    int divider = word.indexOf('-'); 
    String tens = null; 
    String ones = null; 
    if (divider != -1) { 
     tens = word.substring(0, divider); 
     ones = word.substring(divider + 1); 
    } else { 
     ones = word; 
    } 

    //searches for matches in String array for tens 
    if (tens != null) { 
     for (int u = 0; u < wTENS.length; u++) { 
      if (tens.equals(wTENS[u])) { 
       tensValue = nTENS[u]; 
       total += tensValue; 
      } 
     } 
    } 

    //searches for matches in String array for ones 
    for(int u = 0; u < wONES.length; u++) { 
     if (ones.equals(wONES[u])) { 
      onesValue = nONES[u]; 
      total += onesValue; 
     } 
    } 

    // if a "teen" override what's in total 
    for(int u = 0; u < wTEENS.length; u++) { 
    if (ones.equals(wTEENS[u])) { 
     total = nTEENS[u]; 
    } 
    } 

    System.out.println(total); 
} 
2

В текущем коде вы делаете char[] tensArray = null;, который должен быть чем-то вроде char[] tensArray = new char[10];, иначе вы в конечном итоге с NPE.

Это может быть не очень эффективно, но вот простой и лучший подход к вашей проблеме.

  1. Прочитайте строку и разделите ее на пробел (при условии, что вы разделяете свои слова пробелом).

  2. Поиск каждого из токенов, которые вы получаете после разделения в приведенных выше списках, и добавить соответствующий номер (тот же индекс) к вашему ответу.

  3. Распечатать ответ.

Вот фрагмент кода:

class Main 
{ 
    public static final String[] wONES = {"one","two","three","four","five","six", 
              "seven","eight","nine"}; 
    public static final String[] wTENS = {"ten","twenty","thirty","forty","fifty","sixty", 
              "seventy","eighty","ninety"}; 
    public static final String[] wTEENS = {"eleven", "twelve", "thirteen","fourteen", 
              "fifteen", "sixteen", "seventeen", "eighteen", 
              "nineteen"}; 

    public static final int[] nONES = {1,2,3,4,5,6,7,8,9}; 
    public static final int[] nTENS = {10,20,30,40,50,60,70,80,90}; 
    public static final int[] nTEENS = {11,12,13,14,15,16,17,18,19}; 

    public static void main (String[] args) throws Exception 
    { 
     Scanner scInput = new Scanner(System.in); 
     String word = scInput.nextLine(); 
     int answer = 0; 

     /* Assuming you are giving space between words */ 
     for(String s : word.split(" ")) { 
      /* Scan wONES */ 
      for(int i = 0; i < wONES.length; i++) { 
       if(wONES[i].equalsIgnoreCase(s)) { 
        answer += nONES[i]; 
        continue; 
       } 
      } 

      /* Scan wTENS */ 
      for(int i = 0; i < wTENS.length; i++) { 
       if(wTENS[i].equalsIgnoreCase(s)) { 
        answer += nTENS[i]; 
        continue; 
       } 
      } 

      /* Scan wTEENS */ 
      for(int i = 0; i < wTEENS.length; i++) { 
       if(wTEENS[i].equalsIgnoreCase(s)) { 
        answer += nTEENS[i]; 
        continue; 
       } 
      } 
     } 

     System.out.println("Result: " + answer); 
    } 
} 

Вход:

thirty four 

Выход:

34