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,