2017-04-25 49 views
-1

這裏是任務,我給定:我的程序不打印預期輸出

寫一個程序,它要求用戶輸入一個整數,然後輸出該整數一個接一個的數字。例如,如果用戶輸入2017,程序應該輸出「你的數字是2,0,1和7」。使用堆棧來做到這一點。

我已經實現了我的算法但完成這一任務,每當我從打印方法extract_Digits_Stack輸出空白即沒有什麼打印到控制檯返回的結果。任何人都知道爲什麼會這樣?

import java.util.Scanner; 
import java.util.Stack; 

public class Extract_Digits 
{ 
    //main method 
    public static void main(String[] args) 
    { 
    Scanner scanner = new Scanner(System.in); 
    System.out.printf("Enter an integer : "); 
    String inputString = scanner.nextLine(); 

    if (inputString == null || inputString.length() == 0) 
    { 
     System.out.println("Enter the valid integer :"); 
     return; 
    } 
    String digits = extract_Digits_Stack(inputString); 
    System.out.printf(digits); 
    } 
    private static String extract_Digits_Stack(String inputString) 
    { 
    String[] arrString = inputString.split(""); 
    Stack<String> stack = new Stack<String>(); 
    for(String input : arrString) 
    { 
      stack.push(input); 
    } 
    StringBuilder builder = new StringBuilder(); 
    return builder.toString(); 
    } 
} 
+4

請學習如何使用調試器。添加更多關於這個問題的細節。因爲,你的問題很像「爲我修理作業」。請閱讀[我如何問一個好問題?](https://stackoverflow.com/help/how-to-ask)和[爲什麼是「有人可以幫我嗎?」不是一個真正的問題?](https:/ /meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question) – tnw

+1

只是初始化'StringBuilder'並返回它,沒有給它任何價值? –

回答

2
StringBuilder builder = new StringBuilder(); 
return builder.toString(); 

這是返回一個空字符串。

+1

另外'extract_Digits_Stack'的返回類型沒有任何意義。不管你指出的問題,它看起來像OP正確地分離出整數,但隨後將它們重新放回(返回原始字符串)。也許列表或數組會更合適。 – tnw

1

您的代碼中存在一些錯誤/不完整的實現。

  1. 考慮到一個Stack是後進先出的數據結構,將是有意義的參數進行反向推到StackinputString之前。即如果用戶輸入2017,我們將其反轉爲7102,然後push()將其轉換爲Stack

例子:

2 // the forth item pushed to the stack <--- top of stack 
0 // the third item pushed to the stack 
1 // the second item pushed to the stack 
7 // the first item pushed to the stack <--- bottom of stack 

所以當我們執行Pop()操作,結果將是2017因爲:

2 is popped off the stack // append to StringBuilder (2) 
0 is popped off the stack // append to StringBuilder (20) 
1 is popped off the stack // append to StringBuilder (201) 
7 is popped off the stack // append to StringBuilder (2017) 

現在能上實現:

改變這樣的:

String[] arrString = inputString.split(""); 

這樣:

String[] arrString = new StringBuilder(inputString).reverse().toString().split(""); 
  • 你返回一個空StringBuilder,所以讓我們把它做了一些有益的工作。
  • 例子:

    StringBuilder builder = new StringBuilder(); 
    builder.append("your digits are: "); 
    for (int i = 0; i < inputString.length(); i++) { 
        if(i == inputString.length()-1) builder.append(" and "); 
        builder.append(stack.pop()); 
        if(i < inputString.length()-2) builder.append(","); 
    } 
    return builder.toString(); 
    

    輸出示例:

    Enter an integer : 2017 
    your digits are: 2,0,1 and 7 
    

    - 通常你應該使用Stack#empty方法,以確定是否還有留在Stack或not.The元素我在這裏使用for循環的唯一原因只是在執行pop()操作時組織輸出離子對元素。當然還有其他方法可以實現相同的結果。

    全面的方法實現:

    private static String extract_Digits_Stack(String inputString) 
    { 
         String[] arrString = new StringBuilder(inputString).reverse().toString().split(""); 
         Stack<String> stack = new Stack<String>(); 
    
         for(String input : arrString) 
         { 
          stack.push(input); 
         } 
    
         StringBuilder builder = new StringBuilder(); 
         builder.append("your digits are: "); 
         for (int i = 0; i < inputString.length(); i++) { 
          if(i == inputString.length()-1) builder.append(" and "); 
          builder.append(stack.pop()); 
          if(i < inputString.length()-2) builder.append(","); 
         } 
         return builder.toString(); 
    } 
    
    0

    你不添加任何你StringBuilder所以當然它打印出來時,你會得到任何輸出。創建堆棧並將輸入中的每個字符存儲到堆棧後,應該執行的操作是逐個彈出堆棧中的每個字符以構建輸出消息。然而,這個問題是你將字符存入堆棧的順序。從輸入開始直到結束,您正在存儲字符。而應該保存字符從輸入到像這樣開始的結束,

    String[] arrString = inputString.split(""); 
    Stack<String> stack = new Stack<String>(); 
    for(int i = arrString.length - 1; i >= 0; i--) 
    { 
        stack.push(arrString[i]); 
    } 
    return stack; 
    

    所以在進入2017年

    2 <-top of stack 
    0 
    1 
    7 <-bottom of stack 
    

    該堆棧現在看起來是這樣的時候此外,像其他人所說的方法應該真的返回一個Stack<String>以便賦值提示很有意義。現在在主體中,您可以操縱這個堆棧來獲得輸出。

    Stack<String> digits = extract_Digits_Stack(inputString); 
    System.out.print("Your digits are "); 
    while(!digits.empty()){ 
        String digit = digits.pop(); 
        System.out.print(digit + " "); 
    } 
    
    0

    使用push以推動項目到這個堆棧,你應該使用pop在這個堆棧的頂部移除元素並返回該值的上方後,這些值你使用append可以添加到StringBuilder

    private static String extract_Digits_Stack(String inputString) { 
        //To print in the same order as it is entered 
        //String[] arrString = new StringBuilder(inputString).reverse().toString().split(""); 
        String[] arrString = inputString.split(""); 
        Stack<String> stack = new Stack<String>(); 
    
        for (String input : arrString) { 
         stack.push(input); 
        } 
    
        StringBuilder builder = new StringBuilder(); 
        builder.append("The digits are: "); 
        while (!stack.empty()) { 
         builder.append(stack.pop() + ","); // Here append the elements 
        } 
        return builder.toString(); 
    } 
    

    這將打印用逗號分隔的元素:

    The digits are: 7,1,0,2,