【问题标题】:How to get the separate digits of an int number?如何获取整数的单独数字?
【发布时间】:2011-03-24 06:54:14
【问题描述】:

我有 1100、1002、1022 等数字。我想要单独的数字,例如对于第一个数字 1100,我想要 1、1、0、0。

如何在 Java 中获得它?

【问题讨论】:

    标签: java integer modulo


    【解决方案1】:

    使用 LINQ 的 .NET 解决方案。

    List<int> numbers = number.ToString().Select(x => x - 48).ToList();
    

    【讨论】:

      【解决方案2】:

      试试这个。

      const check = (num) => {
        let temp = num
        let result = []
        while(temp > 0){
          let a = temp%10;
          result.push(a);
          temp = (temp-a)/10;
        }
        return result;
      }
      
      check(98) //[ 8, 9 ]
      

      【讨论】:

        【解决方案3】:

        if 数字 意味着是一个 Character

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

        并且以下工作正常
        numstr = "000123" 得到 [0, 0, 0, 1, 2, 3]
        numstr = "-123"    得到 [-, 1, 2, 3]

        【讨论】:

        • Pattern.compile ?这太过分了。
        • @Simon-Forsberg 在撰写本文时,这是创建Character-array 的唯一解决方案。我怀疑一次调用Pattern.compile 比重复调用模运算符% 更耗时,并且它可以同时处理所有大数(没有int-type-limitation)。
        【解决方案4】:

        由于我在这个问题上没有看到使用 Java 8 的方法,所以我将把它扔进去。假设您从 String 开始并想要获得 List&lt;Integer&gt;,那么您可以流式传输像这样的元素。

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

        这会将String 中的字符作为IntStream 获取,将这些字符的整数表示映射到一个数值,将它们装箱,然后将它们收集到一个列表中。

        【讨论】:

        • 有趣的是 chars() 返回一个 IntStream 所以如果你调用 boxed() 和 collect() 你可以立即返回整数列表。
        • 您会返回 ASCII 值。所以 1 映射到 49。
        • 有趣!不知道,ty。
        • 无法编译:Collectors.toList() → "类型不匹配:无法从 Collector> 转换为 Supplier i>", collect → "IntStream 类型中的方法 collect(Supplier, ObjIntConsumer, BiConsumer) 不适用于参数 (Collector>)"
        • 已编辑。他们需要在收集之前装箱。参见例如repl.it/@ifly6/HeftyAffectionateHertz#Main.java
        【解决方案5】:

        你为什么不这样做:

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

        【讨论】:

          【解决方案6】:

          Java 9 引入了一个新的Stream.iterate 方法,可用于生成流并在特定条件下停止。这可用于获取数字中的所有数字,使用模数方法。

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

          请注意,这会以相反的顺序获得数字,但这可以通过向后循环数组来解决(遗憾的是,数组的反转是not that simple),或者通过创建另一个流:

          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]
          

          【讨论】:

          • 现在是一个没有矫枉过正的解决方案!至少对于000123-123 有有趣的结果:-)
          • @Kaplan 问题是关于数字的数字,“-”不是数字。此外,数字“000123”与普通的“123”相同,除非您声称它是用八进制或其他形式编写的,但在这种情况下,它将是一个完全不同的数字。
          • 正如已经广泛讨论的那样,任何使用% 的解决方法都存在省略前导零的缺陷(例如000123)。仅作为再来一次,我的解决方案也适用于标志。顺便说一句:您的解决方案为000123 获得[8, 3]
          • @Kaplan 这个问题是关于获取 int 数字的单独数字,而不是 String 数字。很自然,000123 变成了83,因为 123 OCT = 83 DEC。
          • 唯一的任务是获取数字的位数,而不是进行任何晦涩的数字转换。所以000123 得到[0, 0, 0, 1, 2, 3]。页面上没有其他人误解了这项任务。
          【解决方案7】:

          简单的解决方案

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

          【讨论】:

            【解决方案8】:

            作为菜鸟,我的回答是:

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

            现在所有数字都包含在“digits”数组中。

            【讨论】:

              【解决方案9】:

              都不 chars() 也不 codePoints() ——另一个lambda

              String number = Integer.toString( 1100 );

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

              【讨论】:

                【解决方案10】:

                这个怎么样?

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

                【讨论】:

                • 这是使用 mod 以正确顺序打印内容的好方法。 +1
                • 这很漂亮。我在想:“必须有一种方法可以在不使用集合的情况下反转顺序......”+1
                • 无可挑剔。可能希望将以下代码添加到 getDigits(int num) 以使其免受错误输入的影响:if (number &lt; 0) { return new Integer[0]; } 使用以下输入进行测试:Integer[] samples = {11111, 123457, 0, -13334, 93846, 87892, 9876543, -1234, 012455};
                【解决方案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 
                

                【讨论】:

                • 你说得对,答案是丑陋的。谢谢。
                【解决方案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[] 数组。

                【讨论】:

                  【解决方案13】:

                  在 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]
                  

                  【讨论】:

                    【解决方案14】:
                    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; 
                          } 
                        }
                        }
                    }
                    
                    【解决方案15】:

                    Java 8 解决方案从字符串中获取整数作为 int[]:

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

                    【讨论】:

                    • 除了使用i - '0'之外,还有像Character.toDigit这样的方法,IMO更好用。
                    • @SimonForsberg 您可以参考文档中的方法并给出代码 sn-p 它将如何工作?如果有更优雅的方式,我很乐意更新我的答案。
                    • @qben "0123456789".chars().map(i -&gt; Character.digit(i, 10)).toArray() Character#digit (一个用于char,一个用于int codePoints)
                    【解决方案16】:

                    这样的事情会返回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();
                    }
                    

                    【讨论】:

                      【解决方案17】:

                      这是我的答案,我是为自己做的,我希望它对那些不想使用 String 方法或需要更多数学解决方案的人来说足够简单:

                      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 - 这总是没有任何浮动的东西,因为单位已经消失,重复。

                      【讨论】:

                        【解决方案18】:

                        请参阅下面我与 cmets 的建议

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

                        【讨论】:

                          【解决方案19】:
                          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;
                          }
                          

                          【讨论】:

                          • 请更新您的答案并解释它如何解决问题。仅代码响应通常被认为是质量较差的答案。
                          【解决方案20】:

                          我还没有看到有人使用这种方法,但它对我有用,而且简短而甜蜜:

                          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
                          

                          【讨论】:

                          • 太棒了。谢谢
                          • 由于某种原因,此逻辑对 5542 以外的数字给出错误输出。例如:0142323
                          • @tavalendo 0142323 是一个八进制常数,等于50387,由于前导零,就像0x100 是一个等于256 的十六进制常数,由于前导@987654327 @ 和 0b1011 是一个二进制常量,由于前导 0b 而等于 11。小心整数常量的前导 0!
                          【解决方案21】:

                          将其转换为String 并使用String#toCharArray()String#split()

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

                          如果您已经在使用 Java 8,并且之后碰巧想对其进行一些聚合操作,请考虑使用 String#chars() 从中获取 IntStream

                          IntStream chars = number.chars();
                          

                          【讨论】:

                          • 这是又快又脏的方法。
                          • 对于split(""),数组中的第一项是""。使用其他正则表达式,例如split("(?&lt;=.)")
                          • toCharArray 比拆分快得多。我只是把两个循环都放了 1000 次,toCharArray 用了 20 毫秒,拆分用了 1021 毫秒。我也在数学上使用除以十和 mod (%) 来完成它,这样做需要 50 毫秒,所以 toCharArray 似乎比其他两个更快。
                          • 编辑:我又做了一次,这次肯定有更长的循环(10,000 次迭代)。 toCharArray 比 split 快约 100 倍,toCharArray 比模数数学方法快约 5 倍。
                          • @BalusC number.chars() 将以 Ascii 值而不是数字返回结果。这样数字“1234”将被拆分为“49”、“50”、“51”、“52”,而不是“1”、“2”、“3”、“4”。要做到这一点,它应该看起来像:IntStream chars = number.chars().map(Character::getNumericValue);
                          【解决方案22】:

                          试试这个:

                          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,第三个 = 3 和第四个 = 4 ....

                          【讨论】:

                          • 这不如上面列出的一般方法实用和优雅,原则上也与使用% 的其他答案不同。它几乎没有增加价值。
                          • @Shawn Mehan,我不同意。上面的方法大多是关于使用String或关于长多行的解决方案,而这个简单明了。
                          • 这不支持数字中的任意位数,而是依赖于复制粘贴和修改分配,这很容易出错,因为很容易出错。
                          【解决方案23】:

                          我编写了一个程序来演示如何使用一种更简单易懂的方法来分隔整数的数字,这种方法不涉及数组、递归和所有花哨的花哨的东西。这是我的代码:

                          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
                          

                          【讨论】:

                            【解决方案24】:

                            我认为更简单的方法是将数字转换为字符串并使用substring 提取然后转换为整数。

                            类似这样的:

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

                            输出是 2014

                            【讨论】:

                            • 这里的类型转换会花费更多还是除法操作?
                            【解决方案25】:
                            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
                            【解决方案26】:
                            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。
                            • @Beppe 12344444 不会太大而不能成为 int。 Java 文档声明以下对于 int,从 -2147483648 到 2147483647,包括在内 虽然要确定在您的系统上可以使用 System.out.println(Integer.MAX_VALUE);找出你的 java.lang 包中支持的 max_value
                            【解决方案27】:

                            只是建立在这个主题上,下面是如何在 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;
                            }
                            

                            我确信我可以进一步简化这个算法。然而,这就是我所在的地方。它在我所有的测试用例下都有效。

                            我希望这对某人有所帮助。

                            【讨论】:

                              【解决方案28】:
                              // 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 值?
                              【解决方案29】:

                              这使用模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);
                              

                              【讨论】:

                                【解决方案30】:

                                为此,您将使用% (mod) 运算符。

                                int number; // = some int
                                
                                while (number > 0) {
                                    print( number % 10);
                                    number = number / 10;
                                }
                                

                                mod 运算符将为您提供对数字进行 int 除法的余数。

                                所以,

                                10012 % 10 = 2
                                

                                因为:

                                10012 / 10 = 1001, remainder 2
                                

                                注意: 正如 Paul 所说,这会以相反的顺序为您提供数字。您需要将它们压入堆栈并以相反的顺序将它们弹出。

                                按正确顺序打印数字的代码:

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

                                【讨论】:

                                • 然而,这会让你得到错误顺序的数字,所以你必须确保将它们压入堆栈或只是将它们以相反的顺序放入数组中。
                                • 请注意,这使它们从右到左。 (OP 的示例从左到右显示它们)。处理起来很简单,但应该注意。
                                • @Don,实际上,没有。我不赞成这样做。虽然它比基于字符串的版本快方式。我会查看Marimuthu's 的答案以获取一些快速而简短的代码。
                                • 很好的解决方案,但它似乎无法处理数字以前导零开头的情况。例如 - 001122。如果我使用上述逻辑 - 我只会得到 1,1,2,2。前导 0 被 % 和 / 操作丢弃。如果我错了,请纠正我。
                                • 这里的负整数怎么样?如果我通过 -3432,输出将是 -2-3-4-3,这是不正确的。
                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多