Traductor de número a palabras -- java campo con performance campo con strings campo con numbers-to-words camp codereview Relacionados El problema

Number-to-words translator


2
vote

problema

Español

He creado una clase que traduce un entero en palabras en un formato inglés (no británico). Mi primer idioma humano no es el inglés, y no tengo una buena idea de una forma verdaderamente correcta de leer números, así que seguí el significado exacto de los números (por ejemplo, 1024 = mil veinticuatro, no diez veinticuatro como leído por algunos humanos).

  public class NumsToWords {       private static String[] ones = {"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};     private static String[] tens = {"","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};     private static String hundred = " hundred ";     private static String[] all = {"","thousand","million","billion","trillion","quadrillion"};       public static String translate(String number) {         StringBuilder res = new StringBuilder();         StringBuilder mutableNumber = new StringBuilder(number);         int numberLength = number.length();          // totalTypes is my way of separating the digits in to groups that has three digits each, a ones, tens and hundreds. For example 123456 has two. A thousands part (123) and normal digits (456)         int totalTypes = numberLength/3;         // leadingDigits is my way of finding out of not all parts of a number is complete. That is. in 12345, 12 is the thousand part, not 123.         int leadingDigits = numberLength%3;         if (leadingDigits > 0) {             insertWords(res, mutableNumber, leadingDigits, totalTypes);         }         totalTypes--;         for (int i = leadingDigits; i < numberLength; i+= 3) {             insertWords(res, mutableNumber, 3, totalTypes--);         }         return res.toString().trim();     }      // translate numbers that are present in all types (ones, tens and hundreds)     private static StringBuilder translateHundreds(String number) {         StringBuilder res = new StringBuilder();         if (number.equals("0")) {             res.append("zero");         } else {             int intNumber = Integer.parseInt(number);             if (intNumber >= ones.length) {                 StringBuilder digits = new StringBuilder(number);                 if (digits.length() == 2) {                     res.append(tens[next(digits)]);                     String one = ones[next(digits)];                     if (!one.isEmpty()) {                         res.append("-"+one);                     }                 }                 if (digits.length() == 3) {                     int hundredVal = next(digits);                     res.append(hundredVal == 0 ? "" : ones[hundredVal]+hundred).append(translateHundreds(number.substring(1)));                  }             } else {                 res.append(ones[intNumber]);             }         }         return res;     }      private static void insertWords(StringBuilder res, StringBuilder number, int end, int index) {         StringBuilder trans = translateHundreds(number.substring(0, end));         if (trans.length() > 0) {             res.append(trans).append(" "+all[index]+" ");         }         number.delete(0, end);     }      // read values from part of a number not exceeding three digits     private static int next(StringBuilder str) {         int res = Integer.parseInt(str.substring(0,1));         str.delete(0, 1);         return res;     } }   
  • Estoy manipulando los caracteres en todo el código, así que usé StringBuilder extensivamente para evitar perder objetos. Desafortunadamente, encuentro algunas partes de mi código es casi muy difícil de leer y parece que no estoy realmente ahorrando memoria porque muchos de esos objetos 9988776655544338 se convertirán en cadena la mayor parte del tiempo. ¿Qué tengo que hacer? ¿Es la ventaja de mutabilidad de StringBuilder sobre un import java.util.EmptyStackException; public class Stack<T> { private class Node { private T data; private Node prev, next; public Node() { } public Node(T data) { this.data = data; } } private Node top; public Stack() { top = null; } public boolean empty() { return top == null; } public T peek() { if (top == null) { throw new EmptyStackException(); } return top.data; } public T pop() { if (top == null) { throw new EmptyStackException(); } T value = top.data; top = top.prev; return value; } public T push(T data) { Node temp = new Node(data); if (top == null) { top = temp; } else { top.next = temp; temp.prev = top; top = temp; } return temp.data; } } 0 vale la pena? Estoy usando import java.util.EmptyStackException; public class Stack<T> { private class Node { private T data; private Node prev, next; public Node() { } public Node(T data) { this.data = data; } } private Node top; public Stack() { top = null; } public boolean empty() { return top == null; } public T peek() { if (top == null) { throw new EmptyStackException(); } return top.data; } public T pop() { if (top == null) { throw new EmptyStackException(); } T value = top.data; top = top.prev; return value; } public T push(T data) { Node temp = new Node(data); if (top == null) { top = temp; } else { top.next = temp; temp.prev = top; top = temp; } return temp.data; } } 1 correctamente
  • Muchos de mis nombres de variables no tienen sentido. Realmente no sé qué nombre debería darles generalmente al convertir una cadena que contiene números en un entero real. ¿Es aceptable el nombramiento de mis variables en este código?
  • Creo que hay demasiada fundición entre los tipos en todo el código. ¿Cómo puedo prevenir esto?
  • En general, creo que mi código es extremadamente ineficiente en términos de rendimiento y memoria. También se ve absolutamente feo. ¿Cómo puedo mejorar este código?
Original en ingles

I've created a class that translates an integer into words in an English (not British) format. My first human language is not English, and I don't have a good idea of a truly right way to read numbers, so I followed the exact meaning of the numbers (e.g. 1024 = one thousand twenty-four, not ten twenty-four as read by some humans).

public class NumsToWords {       private static String[] ones = {"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};     private static String[] tens = {"","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};     private static String hundred = " hundred ";     private static String[] all = {"","thousand","million","billion","trillion","quadrillion"};       public static String translate(String number) {         StringBuilder res = new StringBuilder();         StringBuilder mutableNumber = new StringBuilder(number);         int numberLength = number.length();          // totalTypes is my way of separating the digits in to groups that has three digits each, a ones, tens and hundreds. For example 123456 has two. A thousands part (123) and normal digits (456)         int totalTypes = numberLength/3;         // leadingDigits is my way of finding out of not all parts of a number is complete. That is. in 12345, 12 is the thousand part, not 123.         int leadingDigits = numberLength%3;         if (leadingDigits > 0) {             insertWords(res, mutableNumber, leadingDigits, totalTypes);         }         totalTypes--;         for (int i = leadingDigits; i < numberLength; i+= 3) {             insertWords(res, mutableNumber, 3, totalTypes--);         }         return res.toString().trim();     }      // translate numbers that are present in all types (ones, tens and hundreds)     private static StringBuilder translateHundreds(String number) {         StringBuilder res = new StringBuilder();         if (number.equals("0")) {             res.append("zero");         } else {             int intNumber = Integer.parseInt(number);             if (intNumber >= ones.length) {                 StringBuilder digits = new StringBuilder(number);                 if (digits.length() == 2) {                     res.append(tens[next(digits)]);                     String one = ones[next(digits)];                     if (!one.isEmpty()) {                         res.append("-"+one);                     }                 }                 if (digits.length() == 3) {                     int hundredVal = next(digits);                     res.append(hundredVal == 0 ? "" : ones[hundredVal]+hundred).append(translateHundreds(number.substring(1)));                  }             } else {                 res.append(ones[intNumber]);             }         }         return res;     }      private static void insertWords(StringBuilder res, StringBuilder number, int end, int index) {         StringBuilder trans = translateHundreds(number.substring(0, end));         if (trans.length() > 0) {             res.append(trans).append(" "+all[index]+" ");         }         number.delete(0, end);     }      // read values from part of a number not exceeding three digits     private static int next(StringBuilder str) {         int res = Integer.parseInt(str.substring(0,1));         str.delete(0, 1);         return res;     } } 
  • I am manipulating characters all over the code, so I used StringBuilder extensively to avoid wasting objects. Unfortunately, I find some parts of my code is nearly very hard to read and it seems I'm not really saving memory because many of those StringBuilder objects will eventually be converted to String most of the time. What should I do? Is the mutability advantage of StringBuilder over a normal String worth it? Am I using StringBuilder correctly
  • Many of my variable names are meaningless. I really don't know what name I should give them usually when converting a string containing numbers into a real integer. Is the naming of my variables in this code acceptable?
  • I think there are too much casting between types all over the code. How can I prevent this?
  • Overall, I think my code is extremely inefficient in terms of performance and memory. It looks absolutely ugly too. How can I improve this code?
           
 
 

Lista de respuestas


Relacionados problema

3  Convertir números a palabras en inglés  ( Converting numbers to english words ) 
Este es un programa simple para convertir un número, desde 0 hasta 99999999, a palabras en inglés. Ejemplo: Si la entrada es: 1234 La salida sería:...

15  Uno, dos, tres, ... un, deux, trois, ..., maxbound :: int  ( One two three un deux trois maxboundint ) 
Escribí una números -El convertidor de palabras para el inglés, luego intentó adaptar el código para trabajar para el francés. Me pregunto principalmente ...

4  Convertir un número en texto húngaro  ( Converting a number into hungarian text ) 
Me gustaría convertir un número entero de una celda entre 0 y 1,000,000.0000 en texto húngaro. Ya he encontrado una solución, una función VBA. ¿Cómo se pued...

15  Uno, dos, tres, ... un, deux, trois, ..., maxbound :: int  ( One two three un deux trois maxboundint ) 
Escribí una números -El convertidor de palabras para el inglés, luego intentó adaptar el código para trabajar para el francés. Me pregunto principalmente ...

4  Números decimales a la representación de cadenas inglesas  ( Decimal numbers to english string representation ) 
¿Hay algo que pueda haber vuelto a trabajar aquí? Tengo una mente de Java 7, pero estoy trabajando para preparar mi Java 8, por lo que si hay alguna mejoras s...

3  Sistema de numeración india: convirtiendo en las palabras / cadenas oficiales y de uso común  ( Indian numbering system converting into the official and common use numbering ) 
He desarrollado la siguiente función corta de JavaScript para convertir números a los formatos del sistema de numeración india; Tanto el sistema de numeración...

4  Imprima y calcule los números escritos franceses de 1 a 1000 usando Java imperativo  ( Print and calculate french written numbers from 1 to 1000 using imperative java ) 
He escrito un poco (imperativo) Java Programa que básicamente imprime todos los números escritos franceses de 1 a 1000. (Estoy aprendiendo a escribirlos) ...

3  Entero a la conversión inglesa  ( Integer to english conversion ) 
Escribí algún código para traducir números (por ahora, solo positivo, hasta el límite de 32 bits) en palabras en inglés. Todo funciona y estoy feliz. Busqué...

8  Dividiendo una mitad de la mitad en palabras y medio número  ( Dividing a number half into words and half number ) 
Ejemplo: Si tengo un número 1000: Primero pongo comas (en inglés estándar) que lo hace: 1,000 dividí lo anterior en la primera coma: obtengo 1 C...

5  Proyecto EULER NO. 17: contando letras para escribir los números de 1 a 1000  ( Project euler no 17 counting letters to write the numbers from 1 to 1000 ) 
Soy muy nuevo en la programación y, cierto, estoy avergonzado de compartir mi código para la crítica. Este código funciona y produce la respuesta correcta a l...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos