ฉันมีตัวเลขเช่น 1100, 1002, 1022 เป็นต้นฉันต้องการมีตัวเลขแต่ละตัวเช่นหมายเลขแรก 1,100 ฉันต้องการมี 1, 1, 0, 0
ฉันจะรับมันใน Java ได้อย่างไร
ฉันมีตัวเลขเช่น 1100, 1002, 1022 เป็นต้นฉันต้องการมีตัวเลขแต่ละตัวเช่นหมายเลขแรก 1,100 ฉันต้องการมี 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 อยู่แล้วและคุณต้องการดำเนินการรวมบางอย่างในภายหลังลองใช้String#chars()
เพื่อรับประโยชน์IntStream
จากมัน
IntStream chars = number.chars();
split("")
""
ใช้ regex อื่น ๆ split("(?<=.)")
เช่น
number.chars()
จะส่งคืนผลลัพธ์เป็นค่า Ascii ที่ไม่ใช่ตัวเลข ดังนั้นหมายเลข "1234" จะถูกแบ่งเป็น "49", "50", "51", "52" แทน "1", "2", "3", "4" หากต้องการทำอย่างถูกต้องควรมีลักษณะดังนี้:IntStream chars = number.chars().map(Character::getNumericValue);
แล้วเรื่องนี้ล่ะ
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
+1
if (number < 0) { return new Integer[0]; }
ทดสอบด้วยอินพุตต่อไปนี้:Integer[] samples = {11111, 123457, 0, -13334, 93846, 87892, 9876543, -1234, 012455};
ฉันไม่เคยเห็นใครใช้วิธีนี้ แต่มันใช้ได้ผลสำหรับฉันและสั้นและหวาน:
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
0142323
เป็นค่าคงที่ฐานแปดเท่ากับ50387
เนื่องจากนำหน้าศูนย์เช่นเดียว0x100
กับค่าคงที่เลขฐานสิบหกเท่ากับ256
เนื่องจากนำ0x
หน้าและ0b1011
เป็นค่าคงที่ไบนารีเท่ากับ11
เนื่องจากนำ0b
หน้า ระวังการนำ 0 ของค่าคงที่จำนวนเต็ม!
ฉันสังเกตเห็นว่ามีบางตัวอย่างของการใช้ Java 8 สตรีมเพื่อแก้ปัญหาของคุณ แต่ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด:
int[] intTab = String.valueOf(number).chars().map(Character::getNumericValue).toArray();
เพื่อให้ชัดเจน: คุณใช้String.valueOf(number)
ในการแปลง int เป็น String จากนั้นchars()
วิธีการรับ IntStream (อักขระแต่ละตัวจากสตริงของคุณตอนนี้คือหมายเลข ASCII) จากนั้นคุณต้องเรียกใช้map()
วิธีการเพื่อรับค่าตัวเลขของหมายเลข ASCII ในตอนท้ายคุณใช้toArray()
วิธีการเปลี่ยนกระแสข้อมูลของคุณเป็นอาร์เรย์ []
ฉันเห็นคำตอบทั้งหมดน่าเกลียดและไม่ค่อยสะอาด
ฉันขอแนะนำให้คุณใช้การเรียกซ้ำเล็กน้อยเพื่อแก้ปัญหาของคุณ โพสต์นี้เก่ามาก แต่อาจเป็นประโยชน์กับผู้เขียนโค้ดในอนาคต
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
// 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);
วิธีที่ง่ายกว่าฉันคิดว่าการแปลงจำนวนเป็นสตริงและใช้substring
เพื่อแยกแล้วแปลงเป็นจำนวนเต็ม
บางสิ่งเช่นนี้
int digits1 =Integer.parseInt( String.valueOf(201432014).substring(0,4));
System.out.println("digits are: "+digits1);
ouput คือ 2014
ทางออกที่ง่าย
public static void main(String[] args) {
int v = 12345;
while (v > 0){
System.out.println(v % 10);
v /= 10;
}
}
ฉันเขียนโปรแกรมที่แสดงวิธีแยกตัวเลขของจำนวนเต็มโดยใช้วิธีที่ง่ายและเข้าใจได้มากกว่าโดยไม่เกี่ยวข้องกับอาร์เรย์การเรียกซ้ำและการคิดซ้ำที่ซับซ้อน นี่คือรหัสของฉัน:
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
นี่คือคำตอบของฉันฉันทำเพื่อตัวเองและฉันหวังว่ามันจะง่ายพอสำหรับผู้ที่ไม่ต้องการใช้วิธีการแบบ 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 - ซึ่งมักจะไม่มีสิ่งของลอยตัวใด ๆ ตั้งแต่หน่วยหายไปทำซ้ำ
ลองสิ่งนี้:
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 ....
%
ที่ใช้ มันเพิ่มมูลค่าเล็กน้อย
โซลูชัน Java 8 เพื่อรับตัวเลขเป็น int [] จากจำนวนเต็มที่คุณมีเป็นสตริง:
int[] digits = intAsString.chars().map(i -> i - '0').toArray();
i -> i - '0'
แมปเพื่อให้ผลลัพธ์ตรงตามที่ OP ร้องขอ
i - '0'
ยังมีวิธีการCharacter.toDigit
ที่ IMO นั้นดีกว่าที่จะใช้
"0123456789".chars().map(i -> Character.digit(i, 10)).toArray()
ตัวละคร # หลัก (มีหนึ่งสำหรับ char และอีกหนึ่งสำหรับ int codePoints)
ไม่ใช่ 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]
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]
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
วิธีนี้ใช้วิธีโมดูโล 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);
เพียงเพื่อสร้างเรื่องนี้เป็นวิธีการยืนยันว่าจำนวนเป็นจำนวนเต็ม 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;
}
ฉันแน่ใจว่าฉันสามารถทำให้อัลโลนี้ง่ายขึ้นอีก แต่นี่คือที่ฉันอยู่ และมันทำงานภายใต้กรณีทดสอบทั้งหมดของฉัน
ฉันหวังว่านี่จะช่วยให้ใครบางคน
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 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()+ " ");
}
สิ่งนี้จะส่งคืน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();
}
ในฐานะที่เป็น 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))
ตอนนี้ตัวเลขทั้งหมดอยู่ในอาร์เรย์ "หลัก"
ทำไมคุณไม่ทำ:
String number = String.valueOf(input);
char[] digits = number.toCharArray();
เนื่องจากฉันไม่เห็นวิธีการสำหรับคำถามนี้ที่ใช้ Java 8 ฉันจะทิ้งสิ่งต่อไปนี้สมมติว่าคุณเริ่มต้นด้วยString
และต้องการได้รับList<Integer>
จากนั้นคุณสามารถสตรีมองค์ประกอบดังกล่าวได้
List<Integer> digits = digitsInString.chars()
.map(Character::getNumericValue)
.boxed()
.collect(Collectors.toList());
สิ่งนี้จะได้รับตัวอักษรในรูปString
แบบ a IntStream
, แมปการแทนค่าจำนวนเต็มของอักขระเหล่านั้นกับค่าตัวเลขทำเครื่องหมายกล่องเหล่านั้นแล้วรวบรวมลงในรายการ
Collectors.toList()
→ " ประเภทไม่ตรงกัน: ไม่สามารถแปลงจาก Collector <Object, จับ # 3-of ?, รายการ <Object>> ไปยังผู้จัดจำหน่าย <R> ", collect
→ " วิธีการรวบรวม (Supplier <R>, ObjIntConsumer <R >, BiConsumer <R, R>) ในประเภท IntStream ไม่สามารถใช้กับอาร์กิวเมนต์ (Collector <Object,?, List <Object>>) "
ฉันคิดว่านี่จะเป็นวิธีที่มีประโยชน์ที่สุดในการรับตัวเลข:
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;
}
ทั้งสองวิธีที่ฉันได้จัดทำขึ้นเพื่อผลลบจำนวนมากเช่นกัน
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;
}
}
}
}
ใน 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]
ถ้าตัวเลขมีความหมายที่จะเป็น Character
String numstr = Integer.toString( 123 );
Pattern.compile( "" ).splitAsStream( numstr ).map(
s -> s.charAt( 0 ) ).toArray( Character[]::new ); // [1, 2, 3]
Pattern.compile
? นั่นเป็นจำนวนมากเกินไป
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
ขึ้น