1100、1002、1022などの番号があります。たとえば、最初の番号1100に1、1、0、0を付けたい場合は、個々の数字を入力します。
どうやってそれをJavaで手に入れることができますか?
これを行うには、%
(mod)演算子を使用します。
int number; // = some int
while (number > 0) {
print( number % 10);
number = number / 10;
}
Mod演算子はあなたに数のint除算をすることの残りを与えるでしょう。
そう、
10012 % 10 = 2
なぜなら
10012 / 10 = 1001, remainder 2
注:ポールが述べたように、これは逆の順序であなたに数を与えます。あなたはそれらをスタックにプッシュし、逆の順序でそれらをポップする必要があるでしょう。
正しい順序で番号を印刷するコード:
int number; // = and int
LinkedList<Integer> stack = new LinkedList<Integer>();
while (number > 0) {
stack.Push( number % 10 );
number = number / 10;
}
while (!stack.isEmpty()) {
print(stack.pop());
}
これを String
に変換して、 String#toCharArray()
または String#split()
を使用してください。
String number = String.valueOf(someInt);
char[] digits1 = number.toCharArray();
// or:
String[] digits2 = number.split("(?<=.)");
すでにJava 8を使用していて、後でそれに対して集約演算を実行したい場合は、 IntStream
を取得するために String#chars()
を使用することを検討してください。
IntStream chars = number.chars();
これはどう?
public static void printDigits(int num) {
if(num / 10 > 0) {
printDigits(num / 10);
}
System.out.printf("%d ", num % 10);
}
あるいはコンソールに出力する代わりに、整数の配列に集めてから配列を出力することもできます。
public static void main(String[] args) {
Integer[] digits = getDigits(12345);
System.out.println(Arrays.toString(digits));
}
public static Integer[] getDigits(int num) {
List<Integer> digits = new ArrayList<Integer>();
collectDigits(num, digits);
return digits.toArray(new Integer[]{});
}
private static void collectDigits(int num, List<Integer> digits) {
if(num / 10 > 0) {
collectDigits(num / 10, digits);
}
digits.add(num % 10);
}
桁の順序を最下位(index [0])から最上位(index [n])の順に維持したい場合は、以下の更新されたgetDigits()が必要です。
/**
* split an integer into its individual digits
* NOTE: digits order is maintained - i.e. Least significant digit is at index[0]
* @param num positive integer
* @return array of digits
*/
public static Integer[] getDigits(int num) {
if (num < 0) { return new Integer[0]; }
List<Integer> digits = new ArrayList<Integer>();
collectDigits(num, digits);
Collections.reverse(digits);
return digits.toArray(new Integer[]{});
}
私は誰もこの方法を使っているのを見たことがありませんが、それは私のために働いていて、短くて甘いです:
int num = 5542;
String number = String.valueOf(num);
for(int i = 0; i < number.length(); i++) {
int j = Character.digit(number.charAt(i), 10);
System.out.println("digit: " + j);
}
これは出力されます:
digit: 5
digit: 5
digit: 4
digit: 2
私はあなたの問題を解決するためにJava 8ストリームを使用する例がほとんどないことに気づきました、しかし私はこれが最も簡単なものだと思います:
int[] intTab = String.valueOf(number).chars().map(Character::getNumericValue).toArray();
明確にするには:String.valueOf(number)
を使用してintをStringに変換し、次にchars()
メソッドを使用してIntStreamを取得し(文字列の各charはASCII番号になります)、次にmap()
メソッドを実行してASCII番号の数値を取得します。最後にtoArray()
メソッドを使ってストリームをint []配列に変更します。
// could be any num this is a randomly generated one
int num = (int) (Math.random() * 1000);
// this will return each number to a int variable
int num1 = num % 10;
int num2 = num / 10 % 10;
int num3 = num /100 % 10;
// you could continue this pattern for 4,5,6 digit numbers
// dont need to print you could then use the new int values man other ways
System.out.print(num1);
System.out.print("\n" + num2);
System.out.print("\n" + num3);
私はすべての答えが醜く、あまりきれいではないのを見ます。
私はあなたがあなたの問題を解決するために再帰を少し使うことを勧めます。この記事は非常に古くなっていますが、将来のコーダーにとって役に立つかもしれません。
public static void recursion(int number) {
if(number > 0) {
recursion(number/10);
System.out.printf("%d ", (number%10));
}
}
出力:
Input: 12345
Output: 1 2 3 4 5
もっと簡単な方法は、数値を文字列に変換し、substring
を使って抽出してから整数に変換することです。
このようなもの:
int digits1 =Integer.parseInt( String.valueOf(201432014).substring(0,4));
System.out.println("digits are: "+digits1);
出力は2014年です
私は、配列、再帰、およびそれらすべての派手なシュマンシーを含まない、より単純でわかりやすいアプローチを使用して整数の桁を分離する方法を示すプログラムを作成しました。これが私のコードです:
int year = sc.nextInt(), temp = year, count = 0;
while (temp>0)
{
count++;
temp = temp / 10;
}
double num = Math.pow(10, count-1);
int i = (int)num;
for (;i>0;i/=10)
{
System.out.println(year/i%10);
}
入力が整数123
であるとすると、結果の出力は次のようになります。
1
2
3
これが私の答えです。私は自分自身でそれを行いました。文字列アプローチを使用したくない、またはもっと数学的な解決策を必要としない人にとっては、それが十分に単純であることを願います。
public static void reverseNumber2(int number) {
int residual=0;
residual=number%10;
System.out.println(residual);
while (residual!=number) {
number=(number-residual)/10;
residual=number%10;
System.out.println(residual);
}
}
それで、私はただ単位を得て、それらを印刷して、数からそれらを引き、それからその数を10で割る - 単位がなくなったので、何も浮動小数点数がないので、繰り返す。
文字列として持っている整数からint []として数字を取得するJava 8の解決策:
int[] digits = intAsString.chars().map(i -> i - '0').toArray();
このようなものはchar[]
を返します。
public static char[] getTheDigits(int value){
String str = "";
int number = value;
int digit = 0;
while(number>0){
digit = number%10;
str = str + digit;
System.out.println("Digit:" + digit);
number = number/10;
}
return str.toCharArray();
}
どちらでもないchars()
norcodePoints()
-もう一方のラムダ
String number = Integer.toString( 1100 );
IntStream.range( 0, number.length() ).map( i -> Character.digit( number.codePointAt( i ), 10 ) ).toArray(); // [1, 1, 0, 0]
int number = 12344444; // or it Could be any valid number
int temp = 0;
int divider = 1;
for(int i =1; i< String.valueOf(number).length();i++)
{
divider = divider * 10;
}
while (divider >0) {
temp = number / divider;
number = number % divider;
System.out.print(temp +" ");
divider = divider/10;
}
public int[] getDigitsOfANumber(int number) {
String numStr = String.valueOf(number);
int retArr[] = new int[numStr.length()];
for (int i = 0; i < numStr.length(); i++) {
char c = numStr.charAt(i);
int digit = c;
int zero = (char) '0';
retArr[i] = digit - zero;
}
return retArr;
}
これを試して:
int num= 4321
int first = num % 10;
int second = ( num - first ) % 100 / 10;
int third = ( num - first - second ) % 1000 / 100;
int fourth = ( num - first - second - third ) % 10000 / 1000;
First = 1、2 = 2、3 = 3、4 = 4となります。
これはモジュロ10法を使用して、0より大きい数値の各桁を計算します。これにより、配列の順序が逆になります。これは、開始桁として「0」を使用していないことを前提としています。
これは、ユーザー入力を取り込むように変更されています。この配列はもともと逆向きに挿入されているので、Collections.reverse()
呼び出しを使用してユーザーの順序に戻す必要がありました。
Scanner scanNumber = new Scanner(System.in);
int userNum = scanNumber.nextInt(); // user's number
// divides each digit into its own element within an array
List<Integer> checkUserNum = new ArrayList<Integer>();
while(userNum > 0) {
checkUserNum.add(userNum % 10);
userNum /= 10;
}
Collections.reverse(checkUserNum); // reverses the order of the array
System.out.print(checkUserNum);
この質問ではJava 8を使用する方法が見当たらないので、これを投入します。String
から始めてList<Integer>
を取得したいと仮定すると、そのように要素をストリーミングできます。
List<Integer> digits = digitsInString.chars().map(Character::getNumericValue)
.collect(Collectors.toList());
これはString
内の文字をIntStream
として取得し、それらの整数表現の文字を数値にマッピングしてから、それらをリストにまとめます。
私の提案の下にコメントを見てください
int size=i.toString().length(); // the length of the integer (i) we need to split;
ArrayList<Integer> li = new ArrayList<Integer>(); // an ArrayList in whcih to store the resulting digits
Boolean b=true; // control variable for the loop in which we will reatrive step by step the digits
String number="1"; // here we will add the leading zero depending on the size of i
int temp; // the resulting digit will be kept by this temp variable
for (int j=0; j<size; j++){
number=number.concat("0");
}
Integer multi = Integer.valueOf(number); // the variable used for dividing step by step the number we received
while(b){
multi=multi/10;
temp=i/(multi);
li.add(temp);
i=i%(multi);
if(i==0){
b=false;
}
}
for(Integer in: li){
System.out.print(in.intValue()+ " ");
}
Integer.toString(1100)整数を文字列として返します。 Integer.toString(1100).getBytes()個々の数字のバイト配列を取得します。
編集する
文字の数字を数字に変換することができます。
String string = Integer.toString(1234);
int[] digits = new int[string.length()];
for(int i = 0; i<string.length(); ++i){
digits[i] = Integer.parseInt(string.substring(i, i+1));
}
System.out.println("digits:" + Arrays.toString(digits));
この話題を踏まえて、Javaで数値が回文整数であることを確認する方法は次のとおりです。
public static boolean isPalindrome(int input) {
List<Integer> intArr = new ArrayList();
int procInt = input;
int i = 0;
while(procInt > 0) {
intArr.add(procInt%10);
procInt = procInt/10;
i++;
}
int y = 0;
int tmp = 0;
int count = 0;
for(int j:intArr) {
if(j == 0 && count == 0) {
break;
}
tmp = j + (tmp*10);
count++;
}
if(input != tmp)
return false;
return true;
}
私はこのアルゴをさらに単純化できると確信しています。しかし、これが私のいるところです。そしてそれは私のすべてのテストケースでうまくいきました。
これが誰かに役立つことを願っています。