2017-09-02 5 views
1

Je suis nouveau à java et et de travailler sur une calculatrice crud qui prend l'entrée et le maintient dans une ArrayList pour effectuer les calculs.Java int valeur type à caractère

J'essaye d'ajouter deux valeurs dans un ArrayList<Character> et remplace alors le "+" avec la somme.

if(listEqu.contains('+')) { 
     while(listEqu.indexOf('+') > -1) { 

       int plus = listEqu.indexOf('+'); 
       int prev = listEqu.get(plus-1); 
       int nxt = listEqu.get(plus+1); 
       Character sum = (char) (nxt + prev); 

       listEqu.set(plus, sum); 

       System.out.println(listEqu); 

     } 
    } 

Lorsque l'entrée est 1+1, cela renvoie [1, b, 1]. Ce que je veux, c'est retourner [1, 2, 1]. Un conseil? Merci!

+0

« 1 » + « 1 » est de trouver « 1 » sur la ligne de numéro de code de caractère et le déplacement vers la droite à une distance égale entre y et l'origine, pour arriver à « b ». Ce n'était pas ce que tu voulais. (Il est parfois très utile sur des plages de codes de caractères limitées, dans la plupart des cas, un algorithme plus général est préférable.) Comme @StephenC [explique] (https://stackoverflow.com/a/46010463/2226988) , les codes de caractères en question sont le codage UTF-16 du jeu de caractères Unicode. –

Répondre

0

Peu de choses qui peuvent être améliorées avec votre code:

  1. Conversion des caractères 1 en valeur entière équivalent:

    int prev = Integer.parseInt(String.valueOf(listEqu.get(plus-1))); 
    int nxt = Integer.parseInt(String.valueOf(listEqu.get(plus+1))); 
    // Note : int prev = listEqu.get(plus-1) would store an ascii value of `1` to prev value i.e 49 
    
  2. Et puis en convertissant la somme de ceux deux valeurs dans Character retour à ajouter à la liste en utilisant Character.forDigit comme:

    Character sum = Character.forDigit(nxt+prev,10); 
    // Note Character sum = (char) (nxt + prev); is inconvertible 
    // and char sum = (char) (nxt + prev); would store character with ascii value 98(49+49) in your case 'b' to sum 
    
1

Le problème est en fait que l'ajout de deux caractères ne fait pas ce que vous attendez. La valeur de '1' + '1' est 'b'. Si vous voulez le chiffre suivant après '1' vous y ajoutez l'entier 1; c'est-à-dire '1' + 1 est '2'. Pour une meilleure compréhension, vous devez comprendre comment les données de caractères sont représentées dans Java.

Chaque valeur char en Java est un nombre entier non signé de 16 bits qui correspond à un point (ou code de caractère) Code dans le plan de base Unicode. Les premiers 128 de ces points de code (0 à 127) correspondent à un caractère dans l'ancien jeu de caractères ASCII. En ASCII les codes qui représentent les chiffres sont 48 (pour '0') à 39 (pour '9'). Et les lettres minuscules sont 97 (pour 'a') à 122 (pour 'z').

Comme vous pouvez le voir, '1' + '1' ->49 + 49 ->98 ->'b'.

(En fait il y a beaucoup plus à ce que cela. Tous les char valeurs représentent des personnages réels et des codes points Unicode nécessitent deux valeurs char. Mais cela est bien au-delà de la portée de votre question.)


Comment est-ce que je pourrais spécifier l'addition de nombres au lieu de l'addition des caractères?

Vous convertissez le caractère (chiffre) en nombre, effectuez l'opération arithmétique et convertissez le résultat en caractère.

Lire le javadoc pour la classe Character; par exemple. les méthodes Character.digit et Character.forDigit.

Notez que cela ne fonctionne que lorsque les nombres restent entre 0 et 9. Pour un nombre en dehors de cette plage, la représentation du caractère est constituée de deux caractères ou plus. Pour ceux que vous devriez utiliser String plutôt que char. (A String fait également face à l'affaire 1 chiffre aussi ...)

0

vous devez d'abord convertir votre prev et nxt int valeur, puis les ajouter ensemble comme suit:

if(listEqu.contains('+')) { 
    while(listEqu.indexOf('+') > -1) { 

      int plus = listEqu.indexOf('+'); 
      int prev = Integer.parseInt(listEqu.get(plus-1)); 
      int nxt = Integer.parseInt(listEqu.get(plus+1)); 
      Character sum = (char) (nxt + prev); 

      listEqu.set(plus, sum); 

      System.out.println(listEqu); 

    } 
} 
0

nxt et prev sont des valeurs ombles. Ils prennent leur valeur dans la table ASCII, où '1' est 61 et 'b' est 142 (ainsi, '1' + '1' = 'b')

Vous devez soustraire '0' pour obtenir le nombre qu'ils représentent. ('1' - '0' = 61 - 60 = 1)

La somme n'est pas nécessairement inscriptible avec un caractère, vous ne devriez donc pas le remettre dans un tableau char.

Si vous souhaitez convertir un entier en chaîne, utilisez Integer.toString (i).

(Et, si vous voulez, obtenir le premier caractère de la chaîne et le mettre dans le tableau, si c'est ce que vous voulez)

+0

La valeur est remplacée dans le tableau pour être utilisée lorsque plusieurs fonctions sont présentes. Par exemple: '[13, +, 12, -, 2]' devient '[25, -, 2]' et peut être encore simplifié jusqu'à '[23]' –

+0

Mais alors, vous voulez une liste de String, pas une liste de caractères ... Qui ne peut contenir qu'un seul caractère par élément, pas quelque chose comme 12. – Khoyo

+0

Vous faites un point très valide. Mon manque de connaissance en Java est définitivement visible ici ... J'ai encore quelques corrections à faire. –

0

Vous devez analyser les caractères à leur valeur décimale correspondante avant d'effectuer l'addition, puis de nouveau à un personnage après. Les méthodes Character.digit(char, int) et Character.forDigit(int, int) peuvent le faire (et je voudrais utiliser char puisque c'est le type de prev et nxt). Comme,

char prev = listEqu.get(plus - 1); 
char nxt = listEqu.get(plus + 1); 
Character sum = Character.forDigit(Character.digit(nxt, 10) 
     + Character.digit(prev, 10), 10);