ChatGPT解决这个技术问题 Extra ChatGPT

如何获得整数的单独数字?

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

我怎样才能在Java中得到它?


j
jjnguy

为此,您将使用 % (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());
}

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

将其转换为 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("(?<=.)")
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);
S
Someone Somewhere

这个怎么样?

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 < 0) { return new Integer[0]; } 使用以下输入进行测试:Integer[] samples = {11111, 123457, 0, -13334, 93846, 87892, 9876543, -1234, 012455};
Z
Zach Langley

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

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 的十六进制常数,由于前导 0x,而 0b1011 是由于前导 0b,二进制常量等于 11。小心整数常量的前导 0!
K
Koin Arab

我注意到很少有使用 Java 8 流来解决您的问题的示例,但我认为这是最简单的示例:

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

要清楚:您使用 String.valueOf(number) 将 int 转换为 String,然后使用 chars() 方法获取 IntStream(字符串中的每个字符现在都是 Ascii 数字),然后您需要运行 map() 方法来获取数字Ascii 编号的值。最后,您使用 toArray() 方法将您的流更改为 int[] 数组。


J
JoakimE

我看到所有的答案都很丑陋而且不是很干净。

我建议你使用一点递归来解决你的问题。这篇文章很老了,但它可能对未来的编码员有所帮助。

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 

该死的,你的答案是丑陋的。谢谢。
s
slisnychyi

简单的解决方案

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

u
uı6ʎɹnɯ ꞁəıuɐp
// 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 值?
i
ifly6

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

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

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


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

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]。页面上没有其他人误解了这项任务。
S
Siva

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

像这样的东西:

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

输出是 2014


这里的类型转换会花费更多还是除法操作?
F
Flexo

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

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

p
parsecer

这是我的答案,我是为自己做的,我希望对于那些不想使用 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 - 这总是没有任何浮动的东西,因为单位已经消失,重复。


q
qben

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

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

除了使用 i - '0',还有像 Character.toDigit 这样的 IMO 更适合使用的方法。
@SimonForsberg 你可以参考文档中的方法并给出一个代码片段如何工作吗?如果有更优雅的方式,我很乐意更新我的答案。
@qben "0123456789".chars().map(i -> Character.digit(i, 10)).toArray() Character#digit(有一个用于 char 和一个用于 int codePoints)
W
WesternGun

你为什么不这样做:

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

A
Ankit Kumar Rajpoot

试试这个。

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 ]

K
Kaplan

既不 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]

D
Don Branson

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

这有点误导。这将为您提供一个表示字符 '1''0' 的字节数组。字节值不会是 10
误导?这有点苛刻。这个问题模棱两可。这真的取决于他想用数字做什么。你假设他想要进行计算。我的回答假设文本处理。这两种假设都部分正确,但我无意误导。
我想我觉得这是一种误导,因为你得到了一个字节数组,我认为它是数字而不是字符。
@贾斯汀-啊,好吧。我不会自动将字节关联为非字符。在我组装的日子里,我会增加'a'以获得'b',遍历字母表 - 所以有时字节同时是两者。当然,高级语言和 UTF 呈现这一切都没有实际意义。
S
Simple Sandman

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

j
jmarcosSF

只是为了建立这个主题,这里是如何确认数字是 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;
}

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

我希望这可以帮助别人。


A
Akbarsha
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
y
yanisB

尝试这个:

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,我不同意。上面的方法大多是关于使用字符串或关于长的多行解决方案,而这个简单明了。
这不支持数字中的任何位数,但依赖于复制粘贴和修改分配,这很容易出错,因为很容易出错。
S
Shibashis
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;
}

请更新您的答案并解释它如何解决问题。仅代码响应通常被认为是质量较差的答案。
P
Pritam Banerjee

类似这样的内容将返回 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();
}

A
Akenaten

作为菜鸟,我的回答是:

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”数组中。


K
Kaplan

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 类型限制)。
R
Ragowit

使用 LINQ 的 .NET 解决方案。

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

r
ramazan polat

我认为这将是获取数字的最有用的方法:

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 方法的时间太长了。所以会慢一些。您应该创建一个 int 数组,然后调用一次 getDigitsOf 方法,就像在第二个代码块中一样。

在下面的代码中,您可以反向处理。此代码将所有数字放在一起构成数字:

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

我提供的两种方法也适用于负数。


S
SocketM

请参阅下面我的建议和评论

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

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