จะรับตัวเลขที่แยกกันของจำนวน int ได้อย่างไร


143

ฉันมีตัวเลขเช่น 1100, 1002, 1022 เป็นต้นฉันต้องการมีตัวเลขแต่ละตัวเช่นหมายเลขแรก 1,100 ฉันต้องการมี 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
สิ่งนี้จะทำให้คุณได้ตัวเลขในลำดับที่ไม่ถูกต้องดังนั้นคุณจะต้องแน่ใจแล้วผลักมันไปที่สแต็ก
พอลทอมบลิน

4
โปรดทราบว่าสิ่งนี้ให้สิทธิ์จากขวาไปซ้าย (ตัวอย่างของ OP แสดงพวกเขาจากซ้ายไปขวา) ง่ายพอที่จะจัดการ แต่ควรสังเกต
James Curran

1
@ ดอนในทางปฏิบัติไม่ ฉันจะไม่ชอบสิ่งนี้ มันเป็นวิธีที่เร็วกว่ารุ่นที่ใช้สายอักขระ ฉันจะดูคำตอบของ Marimuthuแต่สำหรับรหัสที่รวดเร็วและสั้น
jjnguy

2
วิธีแก้ปัญหาที่ยอดเยี่ยม แต่ดูเหมือนว่าจะไม่จัดการกับสถานการณ์เมื่อตัวเลขเริ่มต้นด้วยเลขศูนย์นำหน้า เช่น - 001122 ถ้าฉันใช้ตรรกะข้างต้น - ฉันจะได้รับเพียง 1,1,2,2 0s ชั้นนำจะลดลงตาม% และ / การดำเนินงาน โปรดแก้ไขฉันหากฉันผิด
goyalshub1509

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จากมัน

IntStream chars = number.chars();

7
นี่เป็นวิธีที่รวดเร็วและสกปรก
jjnguy

8
ด้วยรายการแรกในอาร์เรย์คือsplit("") ""ใช้ regex อื่น ๆ split("(?<=.)")เช่น
True Soft

3
toCharArray เร็วกว่าการแยกมาก ฉันแค่ใส่ทั้งสองเข้าไปในลูป 1,000 ครั้งและ toCharArray ใช้เวลา 20 มิลลิวินาทีและแยกก็ 1021 มิลลิวินาที ฉันยังใช้การคำนวณทางคณิตศาสตร์โดยแบ่งเป็นสิบด้วย mod (%) และใช้เวลา 50 มิลลิวินาทีในการทำเช่นนั้นดังนั้นชาร์อาร์เรย์จึงดูเหมือนว่าจะเร็วกว่าอีกสอง
Jerry Destremps

2
แก้ไข: ฉันเพิ่งทำมันอีกครั้งคราวนี้มีลูปที่ยาวกว่าเพื่อให้แน่ใจ (10,000 ซ้ำ) toCharArray เร็วกว่าการแยกประมาณ 100 เท่าและ toCharArray เร็วกว่าวิธีคณิตศาสตร์ประมาณ 5 เท่า
Jerry Destremps

9
@BalusC number.chars()จะส่งคืนผลลัพธ์เป็นค่า Ascii ที่ไม่ใช่ตัวเลข ดังนั้นหมายเลข "1234" จะถูกแบ่งเป็น "49", "50", "51", "52" แทน "1", "2", "3", "4" หากต้องการทำอย่างถูกต้องควรมีลักษณะดังนี้:IntStream chars = number.chars().map(Character::getNumericValue);
Koin Arab

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

หากคุณต้องการรักษาลำดับของตัวเลขตั้งแต่นัยสำคัญน้อยที่สุด (ดัชนี [0]) ถึงสำคัญที่สุด (ดัชนี [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
bobndrew

ฟ้องร้องได้ อาจต้องการเพิ่มรหัสต่อไปนี้เพื่อ getDigits (int num) เพื่อให้ภูมิคุ้มกันกับอินพุตที่ไม่ดี: 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 0142323เป็นค่าคงที่ฐานแปดเท่ากับ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()วิธีการเปลี่ยนกระแสข้อมูลของคุณเป็นอาร์เรย์ []


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 

ประณามคุณกำลังจะตอบคำถามเกี่ยวกับการ ugle ขอบคุณ
parsecer

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 type มีค่าต่ำสุดคือ -2 ^ 31 และค่าสูงสุด 2 ^ 31-1 วิธีการแก้ปัญหาข้างต้นสามารถทำงานได้กับค่า + ทั้งหมดที่เหมาะสมกับประเภท int?
realPK

3

วิธีที่ง่ายกว่าฉันคิดว่าการแปลงจำนวนเป็นสตริงและใช้substringเพื่อแยกแล้วแปลงเป็นจำนวนเต็ม

บางสิ่งเช่นนี้

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

ouput คือ 2014


การแปลงประเภทที่นี่จะมีค่าใช้จ่ายมากกว่า
ราหุล


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

สมมติว่าอินพุตของคุณเป็นจำนวนเต็ม123ผลลัพธ์ที่ได้จะเป็นดังนี้:

1
2
3

2

นี่คือคำตอบของฉันฉันทำเพื่อตัวเองและฉันหวังว่ามันจะง่ายพอสำหรับผู้ที่ไม่ต้องการใช้วิธีการแบบ 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 - ซึ่งมักจะไม่มีสิ่งของลอยตัวใด ๆ ตั้งแต่หน่วยหายไปทำซ้ำ


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, สาม = 3 และสี่ = 4 ....


นี้จะน้อยกว่าประโยชน์และสง่างามกว่าวิธีทั่วไปที่กล่าวข้างต้นไม่เป็นมันที่แตกต่างกันในหลักการมากกว่าคำตอบอื่น ๆ %ที่ใช้ มันเพิ่มมูลค่าเล็กน้อย
Shawn Mehan

@Shawn Mehan ฉันจะไม่เห็นด้วย วิธีการข้างต้นส่วนใหญ่เกี่ยวกับการใช้ String หรือวิธีแก้ปัญหาที่มีหลายแถวยาวในขณะที่วิธีนี้ง่ายและเรียบง่าย
parsecer

1

โซลูชัน Java 8 เพื่อรับตัวเลขเป็น int [] จากจำนวนเต็มที่คุณมีเป็นสตริง:

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

ฉันลองแล้วไม่ได้ผล คุณอาจลอง "12" .chars (). toArray () และคุณจะพบว่าแทนที่จะส่งกลับ [1,2] จะส่งกลับ [49,50] ที่ฉันคิดว่าจริง ๆ แล้วคือรหัส ASCII สำหรับ '1' และ '2' และนั่นไม่ใช่สิ่งที่ OP ต้องการแน่นอน
Fran Marzoa

@Fran คุณพูดถูก ฉันอัปเดตคำตอบของฉันเพื่อรวมการi -> i - '0'แมปเพื่อให้ผลลัพธ์ตรงตามที่ OP ร้องขอ
qben

แทนที่จะใช้i - '0'ยังมีวิธีการCharacter.toDigitที่ IMO นั้นดีกว่าที่จะใช้
Simon Forsberg

@SimonForsberg คุณสามารถอ้างอิงวิธีการในเอกสารและให้ข้อมูลโค้ดว่ามันทำงานอย่างไร ฉันยินดีที่จะอัปเดตคำตอบหากมีวิธีที่หรูหรากว่านี้
qben

@qben "0123456789".chars().map(i -> Character.digit(i, 10)).toArray() ตัวละคร # หลัก (มีหนึ่งสำหรับ char และอีกหนึ่งสำหรับ int codePoints)
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));

นี่เป็นสิ่งที่ทำให้เข้าใจผิดเล็กน้อย ซึ่งจะทำให้คุณอาร์เรย์ไบต์คิดเป็นถ่านหรือ'1' '0'ค่าไบต์นิสัยเป็นหรือ1 0
jjnguy

ทำให้เข้าใจผิด? นั่นเป็นเพียงเล็กน้อยที่รุนแรง คำถามนั้นคลุมเครือ มันขึ้นอยู่กับสิ่งที่เขาต้องการจะทำกับตัวเลข คุณกำลังสมมติว่าเขาต้องการคำนวณ คำตอบของฉันถือว่าการประมวลผลข้อความ การสันนิษฐานไม่ถูกต้องบางส่วน แต่มันไม่ใช่ความตั้งใจของฉัน
Don Branson

ฉันคิดว่าฉันรู้สึกว่ามันทำให้เข้าใจผิดเพราะคุณได้รับอาร์เรย์ของไบต์ซึ่งฉันคิดว่าตัวเลขไม่ใช่ตัวอักษร
jjnguy

@Justin - อ่าโอเค ฉันไม่เชื่อมโยงไบต์เป็นอักขระโดยอัตโนมัติ ในวันประชุมฉันจะเพิ่ม 'a' เพื่อรับ 'b' ซ้ำผ่านตัวอักษร - ดังนั้นบางครั้งไบต์ก็พร้อมกัน แน่นอนว่าภาษาระดับสูงและ 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

เพียงเพื่อสร้างเรื่องนี้เป็นวิธีการยืนยันว่าจำนวนเป็นจำนวนเต็ม palindromic ใน 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
Giuseppe Garassino

@Beppe 12344444 ไม่ใหญ่เกินไปที่จะเป็น int เอกสาร Java อ้างว่าต่อไปนี้สำหรับ int ตั้งแต่ -2147483648 ถึง 2147483647 รวมถึงแม้ว่าจะรู้อย่างแน่นอนในระบบของคุณคุณสามารถใช้ System.out.println (Integer.MAX_VALUE); เพื่อหา max_value ที่รองรับในแพ็คเกจ java.lang ของคุณ
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

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

ในฐานะที่เป็น noob คำตอบของฉันจะเป็น:

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

เนื่องจากฉันไม่เห็นวิธีการสำหรับคำถามนี้ที่ใช้ Java 8 ฉันจะทิ้งสิ่งต่อไปนี้สมมติว่าคุณเริ่มต้นด้วยStringและต้องการได้รับList<Integer>จากนั้นคุณสามารถสตรีมองค์ประกอบดังกล่าวได้

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

สิ่งนี้จะได้รับตัวอักษรในรูปStringแบบ a IntStream, แมปการแทนค่าจำนวนเต็มของอักขระเหล่านั้นกับค่าตัวเลขทำเครื่องหมายกล่องเหล่านั้นแล้วรวบรวมลงในรายการ


ตัวอักษรที่น่าสนใจพอ () ส่งคืน IntStream ดังนั้นถ้าคุณโทรไปที่กล่อง () และรวบรวม () คุณสามารถส่งคืน List of Integers ได้ทันที
เจสัน

1
คุณได้รับค่า ASCII กลับมา ดังนั้น 1 แผนที่ถึง 49
ifly6

! ที่น่าสนใจ ไม่รู้ด้วยซ้ำ
Jason

ไม่ได้รวบรวม: Collectors.toList()→ " ประเภทไม่ตรงกัน: ไม่สามารถแปลงจาก Collector <Object, จับ # 3-of ?, รายการ <Object>> ไปยังผู้จัดจำหน่าย <R> ", collect→ " วิธีการรวบรวม (Supplier <R>, ObjIntConsumer <R >, BiConsumer <R, R>) ในประเภท IntStream ไม่สามารถใช้กับอาร์กิวเมนต์ (Collector <Object,?, List <Object>>) "
Gerold Broser

แก้ไข พวกเขาจะต้องได้รับการบรรจุกล่องก่อนที่จะรวบรวม ดูเช่นrepl.it/@ifly6/HeftyAffectionateHertz#Main.java
ifly6 6

-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 เวลามากเกินไป ดังนั้นมันจะช้าลง คุณควรสร้างอาร์เรย์ 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;
}

ทั้งสองวิธีที่ฉันได้จัดทำขึ้นเพื่อผลลบจำนวนมากเช่นกัน


-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 นี่คือวิธีที่คุณสามารถแยกตัวเลขออกจากตัวเลขและเก็บไว้ใน Array

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

ถ้าตัวเลขมีความหมายที่จะเป็น 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.