Когда я печатаю элемент массива символов, индекс в [5] и [6] неверен на выходе.

package id_code;
import java.util.Scanner;

public class Main {
 
    public static void main(String[] args) {
        // creating input
        Scanner input = new Scanner(System.in);
        
        System.out.println("Enter your Id: ");
        long id = input.nextLong();
        
        // convert id from (int) to (String)
        String str_id = String.valueOf(id);
        
        // convert id (String) to array of (char[])
        char[] id_holder = str_id.toCharArray();
        
        // print elemnt of array 
        System.out.print(id_holder[5] + id_holder[6] + " - " + id_holder[3] + id_holder[4] + " - " + id_holder[1] + id_holder[2] + "\n");
        
       
        // Index ->  0 1 2 3 4 5 6 7 8 9 10
        // number -> 1 1 2 2 3 3 4     

    }
    
}

Выход:

Enter your Id: 

1302579

112 - 25 - 30

Правильный вывод должен быть:

79 - 25 - 30

Есть причины, почему это происходит?

0
Mark Zack 25 Ноя 2022 в 20:27

3 ответа

Лучший ответ

Проблема первое выражение, напечатанное в этой строке

System.out.print(id_holder[5] + id_holder[6] + " - " + id_holder[3] + id_holder[4] + " - " + id_holder[1] + id_holder[2] + "\n");

Является id_holder[5] + id_holder[6], что является арифметическим: Java приводит каждое char к int (их значение ascii) и добавляет их к общему количеству 112.

Следующим добавленным термином является строка, поэтому Java объединяет 112 и "-", чтобы получить другую строку, и с этого момента строка строится.

Один простой способ исправить это — начать со строки (пустой строки):

System.out.print("" + id_holder[5] + id_holder[6] + " - " + id_holder[3] + id_holder[4] + " - " + id_holder[1] + id_holder[2] + "\n");

Делая это, Java будет объединять каждый термин (по одному) в виде строки.


Кстати, еще один способ добиться результата, используя только 1 строку кода, - использовать регулярное выражение:

System.out.println(String.valueOf(id).replaceAll(".(..)(..)(..)", "$3 - $2 - $1"));
1
Bohemian 25 Ноя 2022 в 20:58

Нет необходимости создавать массив символов.

Вы можете сделать это легко, выполнив что-то вроде этого:

System.out.printf("%s%s",str_id.charAt(4),str_id.charAt(5));

В твоем случае-

 System.out.printf("%s%s - %s%s - %s%s",str_id.charAt(5),str_id.charAt(6),str_id.charAt(3),str_id.charAt(4),str_id.charAt(1),str_id.charAt(2));
0
Kaushal 25 Ноя 2022 в 20:52

Почему бы просто не использовать String.substring(), поскольку вы уже преобразовали число в строку?

  public static void main( String [] args) {
    Scanner input = new Scanner(System.in);
    
    System.out.print("Enter your Id: ");
    long id = input.nextLong();
    
    String str_id = String.valueOf(id);
    if (str_id.length() >= 7) {
      String output = str_id.substring(5, 7) + " - " + str_id.substring(3, 5) + " - " + str_id.substring(1, 3);
      System.out.println(output);
    }                
  }

Выход:

Enter your Id: 1302579
79 - 25 - 30
0
Idle_Mind 25 Ноя 2022 в 20:55