int番号の個別の桁を取得するにはどうすればよいですか?


143

1100、1002、1022などの数字があります。たとえば、最初の数字が1100の場合、1、1、0、0にしたい個々の数字が欲しいです。

どうすればJavaで取得できますか?

回答:


204

これを行うには、%(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());
}

4
ただし、これにより数値が間違った順序で取得されるため、確実にスタックにプッシュするか、逆の順序で配列に配置する必要があります。
Paul Tomblin、2010

4
これは右から左にそれらを与えることに注意してください。(OPの例では、左から右に示しています)。処理するのに十分簡単ですが、注意する必要があります。
James Curran

1
@ドン、実際には違います。私はこれを支持しません。それはある方法より速くしかし、文字列ベースのバージョンより。マリムトゥの答えをいくつかの高速で短いコードについて調べます。
jjnguy

2
すばらしい解決策ですが、数値が先行ゼロで始まる場合はシナリオを処理しないようです。たとえば-001122。上記のロジックを使用すると、1、1、2、2のみが取得されます。先頭の0は、%および/操作によって削除されます。私が間違っていたら訂正してください。
goyalshub1509 2016

2
ここで負の整数はどうですか?-3432を渡すと、出力は-2-3-4-3になり、正しくありません。
Nodir Nasirov

75

変換してまたはStringを使用します。String#toCharArray()String#split()

String number = String.valueOf(someInt);

char[] digits1 = number.toCharArray();
// or:
String[] digits2 = number.split("(?<=.)");

すでにJava 8を使用String#chars()していIntStreamて、後でJava 8でいくつかの集計操作を実行したい場合は、Java 8を利用することを検討してください。

IntStream chars = number.chars();

7
これは迅速で汚い方法です。
jjnguy

8
ではsplit("")、配列の最初の項目は""です。など、他の正規表現を使用しsplit("(?<=.)")ます。
True Soft

3
toCharArrayは分割よりもはるかに高速です。両方をループに1000回入れただけで、toCharArrayには20ミリ秒、スプリットには10​​21ミリ秒かかりました。また、mod(%)で10による除算を使用して数学的にそれを行い、50ミリ秒かかるため、toCharArrayは他の2つよりも高速であるように見えます。
Jerry Destremps 2013

2
編集:もう一度繰り返しましたが、今回は確かに長いループ(10,000反復)を使用しています。toCharArrayは分割よりも約100倍高速で、toCharArrayはモジュラス数学メソッドよりも約5倍高速です。
Jerry Destremps、2013

9
@BalusC number.chars()は数値ではなくASCII 値で結果を返します。そのため、「1234」は「1」、「2」、「3」、「4」ではなく「49」、「50」、「51」、「52」に分割されます。これを行うには右のそれは次のようになります。IntStream chars = number.chars().map(Character::getNumericValue);
光陰アラブ

29

これはどう?

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[]{});
}

1
これは、modを使用して正しい順序で印刷するための良い方法です。 +1
jjnguy

1
美しいです。私は考えていました:「コレクションを使用せずに順序を逆にする方法がある+1
はず

申し分のない。悪い入力に免疫にするために(int型数値)getDigitsに次のコードを追加したい場合があります:if (number < 0) { return new Integer[0]; } 次の入力でテスト:Integer[] samples = {11111, 123457, 0, -13334, 93846, 87892, 9876543, -1234, 012455};
realPK

24

私は誰もがこの方法を使用するのを見たことはありませんが、それは私にとってはうまくいき、短くて甘いです:

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

すごいです。ありがとう
Marwa Eltayeb

何らかの理由で、このロジックは5542とは異なる数値に対して誤った出力を提供します。たとえば、0142323
tavalendo

@tavalendoが01423238進定数であるに等しい50387だけのように伴う先行ゼロに、0x100進定数に等しい256、リーディングによる0x、および0b1011バイナリ定数であるに等しい11つながるによる0b。整数定数の先頭の0に注意してください!
AJNeufeld、

12

Java 8ストリームを使用して問題を解決する例はほとんどないことに気づきましたが、これが最も簡単な方法だと思います。

int[] intTab = String.valueOf(number).chars().map(Character::getNumericValue).toArray();

明確にするために:String.valueOf(number)intをStringに変換し、次にchars()IntStreamを取得するメソッド(文字列の各文字はASCII番号になります)を使用し、map()メソッドを実行してASCII番号の数値を取得する必要があります。最後に、toArray()メソッドを使用してストリームをint []配列に変更します。


11

私はすべての答えが醜く、あまりきれいではないようです。

問題を解決するには、再帰を少し使用することをお勧めします。この投稿は非常に古いですが、将来のプログラマーにとって役立つかもしれません。

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 

いまいましい答えは醜いです。ありがとう。
パーサー

6
// 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);

Javaのint型の最小値は-2 ^ 31、最大値は2 ^ 31-1です。上記のソリューションは、int型に適合するすべての+ ve値に対してどのように機能しますか?
realPK 2016

3

私が考える最も簡単な方法は、数値を文字列にsubstring変換し、それを使用して抽出してから整数に変換することです。

このようなもの:

int digits1 =Integer.parseInt( String.valueOf(201432014).substring(0,4));
    System.out.println("digits are: "+digits1);

出力は2014年


ここでの型変換はより多くのコストまたは除算演算を必要としますか
Rahul

2

私は、配列、再帰、およびそれらのすべての豪華なシュマンシーを含まない、より単純で理解可能なアプローチを使用して整数の桁を分離する方法を示すプログラムを作成しました。これが私のコードです:

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);
}

入力がinteger 123であるとすると、結果の出力は次のようになります。

1
2
3

2

これが私の答えです。私は自分でそれを行いました。文字列アプローチを使用したくない、またはより数学的な解決策が必要ない人にとっては、それが十分に簡単であることを願っています。

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で割ります。


2

簡単な解決策

public static void main(String[] args) {
    int v = 12345;
    while (v > 0){
        System.out.println(v % 10);
        v /= 10;
    }
}

1

これを試して:

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;

最初に= 1、2番目に= 2、3番目に= 3、4番目に= 4 ...となります。


これは、上記の一般的な方法よりも実用的でなく、エレガントでもありません%。それはほとんど価値を追加しません。
Shawn Mehan

@ショーン・メハン、私は反対するでしょう。上記の方法は主に文字列の使用または長い複数行のソリューションに関するものですが、これは単純明快です。
パーサー2016

1

あなたが文字列として持っている整数からint []として数字を取得するJava 8ソリューション:

int[] digits = intAsString.chars().map(i -> i - '0').toArray();

私はこれを試しましたが、うまくいきません。"12" .chars()。toArray()を試してみると、[1,2]を返す代わりに[49,50]を返すことがわかります。これは、実際には「1」のASCIIコードであり、 「2」、そしてそれは間違いなくOPが望んだものではありません。
フランマルゾア2017年

@フランあなたは正しい。i -> i - '0'その結果がOPが要求したとおりになるように、マッピングを含めるように私の回答を更新しました。
qben

使用i - '0'する代わりにCharacter.toDigit、IMOを使用する方がよいという方法もあります。
Simon Forsberg

@SimonForsbergは、ドキュメント内のメソッドを参照して、コードスニペットがどのように機能するかを説明できますか?よりエレガントな方法がある場合、私は私の答えを更新させていただきます。
qben

@qben "0123456789".chars().map(i -> Character.digit(i, 10)).toArray() Character#digit(charとint codePointsに1つずつ)
Simon Forsberg

1

どちら chars() でもない codePoints() —他のラムダ

String number = Integer.toString( 1100 );

IntStream.range( 0, number.length() ).map( i -> Character.digit( number.codePointAt( i ), 10 ) ).toArray();  // [1, 1, 0, 0]

1

Java 9では、Stream.iterateストリームを生成して特定の条件で停止するために使用できる新しいメソッドが導入されました。これは、モジュロアプローチを使用して、数値のすべての桁を取得するために使用できます。

int[] a = IntStream.iterate(123400, i -> i > 0, i -> i / 10).map(i -> i % 10).toArray();

これは数字を逆の順序で取得しますが、配列を逆方向にループすることで解決できます(悲しいことに、配列を逆にするのは簡単ではありません)。または、別のストリームを作成することで解決できます。

int[] b = IntStream.iterate(a.length - 1, i -> i >= 0, i -> i - 1).map(i -> a[i]).toArray();

または

int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length - i]).toArray();

例として、このコード:

int[] a = IntStream.iterate(123400, i -> i > 0, i -> i / 10).map(i -> i % 10).toArray();
int[] b = IntStream.iterate(a.length - 1, i -> i >= 0, i -> i - 1).map(i -> a[i]).toArray();
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));

印刷されます:

[0, 0, 4, 3, 2, 1]
[1, 2, 3, 4, 0, 0]

0

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));

これは少し誤解を招く可能性があります。これにより、char '1'またはを表すバイトの配列が得られます'0'。バイト値は1、またはではありません0
jjnguy

誤解を招く?それは少し厳しいです。質問はあいまいでした。それは本当に彼が数字で何をしたいかによります。あなたは彼が計算を実行したいと仮定しています。私の答えはテキスト処理を前提としています。どちらの仮定も部分的に正しいですが、誤解を招くのは私の意図ではありませんでした。
Don Branson、2010

あなたがバイトの配列を取得するので、それは誤解を招くと思います。文字の配列ではなく、数値の配列だと思います。
jjnguy

@ジャスティン-ああ、大丈夫。バイトを文字ではなく自動的に関連付けることはしません。私の組み立ての日、私は 'b'を取得するために 'a'をインクリメントし、アルファベットを繰り返します-したがって、時々バイトは同時に両方でした。もちろん、高級言語とUTFはそれをすべて悲観的にします。
Don Branson

0

これは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);

0

件名に基づいて構築するために、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;
}

このアルゴをさらに簡略化できると確信しています。しかし、これは私がいるところです。そして、それは私のすべてのテストケースで機能しました。

これが誰かの役に立つことを願っています。


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;
}

12344444はintになるには大きすぎます。
ジュゼッペガラッシーノ2013

@Beppe 12344444はintになるには大きすぎません。Java docsは、次のFor intを-2147483648から2147483647まで包括的に主張しています。java.langパッケージでサポートされているmax_valueを確認するには
OrwellHindenberg

0
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;
}

1
回答を更新して、問題がどのように解決されるかを説明してください。コードのみの応答は、一般に質の低い応答と見なされます。
devlin carnate 2016

0

コメント付きで私の提案の下を参照してください

          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()+ " ");
                }

0

このような何かが返されます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();
}

0

初心者として、私の答えは:

String number = String.valueOf(ScannerObjectName.nextInt()); 
int[] digits = new int[number.length()]; 
for (int i = 0 ; i < number.length() ; i++)
    int[i] = Integer.parseInt(digits.substring(i,i+1))

これで、すべての数字が「数字」配列に含まれます。


0

なぜしないのですか:

String number = String.valueOf(input);
char[] digits = number.toCharArray();

0

この質問ではJava 8を使用するメソッドが見当たらないので、これを投入します。aから始めてStringを取得したいList<Integer>場合は、そのように要素をストリーミングできます。

List<Integer> digits = digitsInString.chars()
        .map(Character::getNumericValue)
        .boxed()
        .collect(Collectors.toList());

これは内の文字をStringとして取得し、IntStreamそれらの文字の整数表現を数値にマップし、ボックス化して、それらをリストに収集します。


興味深いことに、chars()はIntStreamを返すため、boxed()およびcollect()を呼び出すと、整数のリストをすぐに返すことができます。
Jason

1
ASCII値が返されます。だから、49に1つのマップ
ifly6

面白い!知らなかった、ty。
Jason

コンパイルしない:Collectors.toList()→ " タイプが一致しません:Collector <Object、capture#3-of?、List <Object >>からSupplier <R>に変換できません "、collect→ " メソッドcollect(Supplier <R>、ObjIntConsumer <R >、BiConsumer <R、R>)タイプIntStreamは引数(Collector <Object、?、List <Object >>)に適用できません "
Gerold Broser

編集。収集する前に箱に入れる必要があります。例:repl.it/@ifly6/HeftyAffectionateHertz#Main.java
ifly6

-1

これは数字を取得するための最も便利な方法になると思います。

public int[] getDigitsOf(int num)
{        
    int digitCount = Integer.toString(num).length();

    if (num < 0) 
        digitCount--;           

    int[] result = new int[digitCount];

    while (digitCount-- >0) {
        result[digitCount] = num % 10;
        num /= 10;
    }        
    return result;
}

その後、簡単な方法で数字を取得できます。

int number = 12345;
int[] digits = getDigitsOf(number);

for (int i = 0; i < digits.length; i++) {
    System.out.println(digits[i]);
}

またはもっと簡単に:

int number = 12345;
for (int i = 0; i < getDigitsOf(number).length; i++) {
    System.out.println(  getDigitsOf(number)[i]  );
}

最後のメソッドがgetDigitsOfメソッドを呼び出す時間が長すぎることに注意してください。したがって、それは遅くなります。2番目のコードブロックと同じように、int配列を作成してからgetDigitsOfメソッドを1回呼び出す必要があります。

次のコードでは、処理を逆にすることができます。このコードは、すべての数字を組み合わせて数値を作成します。

public int digitsToInt(int[] digits)
{
    int digitCount = digits.length;
    int result = 0;

    for (int i = 0; i < digitCount; i++) {
        result = result * 10;
        result += digits[i];
    }

    return result;
}

私が提供した両方の方法は、負の数でも機能します。


-1
import java.util.Scanner;

class  Test 
{  
    public static void main(String[] args)   
    {  
        Scanner sc = new Scanner(System.in); 


    int num=sc.nextInt(); 
    System.out.println("Enter a number (-1 to end):"+num);
    int result=0;
    int i=0;
    while(true) 
    { 
      int n=num%10;
      if(n==-1){
        break;
      }
      i++;
      System.out.println("Digit"+i+" = "+n);
      result=result*10+n;
      num=num/10; 


      if(num==0) 
      { 
        break; 
      } 
    }
    }
}


答えは→[リンク]ですstackoverflow.com/questions/47196499/...
always007

-1

Javaでは、これは数字から数字を分離して配列に格納する方法です。

public static void main(String[] args) {
        System.out.println("Digits Array:: "+Arrays.toString(getNumberArr(1100)));
}

private static Integer[] getNumberArr(int number) {
    //will get the total number of digits in the number
    int temp = number;
    int counter = 0;

    while (temp > 0) {
        temp /= 10;
        counter++;
    }
    //reset the temp
    temp = number;

    // make an array
    int modulo;     //modulo is equivalent to single digit of the number.
    Integer[] numberArr = new Integer[counter];
    for (int i = counter - 1; i >= 0; i--) {
        modulo = temp % 10;
        numberArr[i] = modulo;  
        temp /= 10;
    }

    return numberArr;
}

出力:

Digits Array:: [1, 1, 0, 0]

-1

場合は桁がAであることを意味します Character

String numstr = Integer.toString( 123 );
Pattern.compile( "" ).splitAsStream( numstr ).map(
  s -> s.charAt( 0 ) ).toArray( Character[]::new );  // [1, 2, 3]

Pattern.compile?それはやり過ぎです。
Simon Forsberg

-3
import java.util.Scanner;

public class SeparatingDigits {

    public static void main( String[] args )
    {

        System.out.print( "Enter the digit to print separately :- ");
        Scanner scan = new Scanner( System.in );

        int element1 = scan.nextInt();
        int divider;

        if( ( element1 > 9999 ) && ( element1 <= 99999 ) )
        {
            divider = 10000;
        }
        else if( ( element1 > 999 ) && ( element1 <= 9999 ) )
        {
            divider = 1000;
        }
        else if ( ( element1 > 99) && ( element1 <= 999 ) )
        {
            divider = 100;
        }
        else if( ( element1 > 9 ) && ( element1 <= 99 ) )
        {
            divider = 10;
        }
        else 
        {
            divider = 1;
        }

        quotientFinder( element1, divider );




    }

     public static void quotientFinder( int elementValue, int dividerValue )
     {
         for( int count = 1;  dividerValue != 0; count++)
         {
            int quotientValue = elementValue / dividerValue ;
            elementValue = elementValue % dividerValue ;
            System.out.printf( "%d  ", quotientValue );

            dividerValue /= 10;

         }
     }
    }

配列と文字列を使用しない。(1から99999桁)

出力:

個別に印刷する桁を入力してください:-12345

1 2 3 4 5


より効率的かつ動的にを決定する方法がなければなりませんdivider
ZX9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.