简单的奇数&甚至在Java

时间:2015-08-12 23:26:25

标签: java

我还是Java新手,因为我最近刚刚在课程中学习了这门课程。我仍然对如何将已排序的输入对齐到指定位置感到困惑。

例如你输入:1,2,3,4,5 输出将是所有奇数将在奇数文本/标题下对齐,然后所有偶数将落在偶数标题下。

这是我的代码:

     public static void main(String[] args) {
           int num;
           String odd="",even="",var, output="";

          for (int cntr = 0; cntr < 5; cntr++){
               var = JOptionPane.showInputDialog("Input Number: ");
               num = Integer.parseInt(var);

                if (num % 2 == 1)
                    odd = odd +"\n"+ String.valueOf(num);
                if (num % 2 == 0)
                    even = even+"\n"+ String.valueOf(num);

                  output = odd +"\t"+even;

              }
              System.out.print("Odd\tEven"+ output);

问题在于,当你运行它时,输出是这样的,它排序的最高位数是赔率,然后底部数字是偶数,但它在奇数标题下对齐。

你能推荐什么?这里有新成员。很高兴见到你们!

3 个答案:

答案 0 :(得分:1)

错误的方法,你正确区分奇数和偶数,但字符串不是如上所述打印它们的方式。你以:

结尾
odd = "1\n3\n5\n"
even = "2\n4\n"
output = "1\n3\n5\n\t2\n4\n"

即所有赔率数(一个接一个),一个标签,然后是偶数。

您需要以更有条理的方式存储数字;最佳选择是两个java.util.ArrayList<Integer>。拥有两个整数列表后,打印它们应该更容易(对于第一行,打印第一个偶数,选项卡,然后是第一个奇数;不要忘记检查列表是否有不同的大小)。 / p>

这有一个额外的好处,如果明天提交结果的方式发生变化,你不需要改变将每个数字放在其列表中的逻辑(将业务逻辑与表示/ UI分离 )。

答案 1 :(得分:1)

如果您使用的是Java 8,它提供了一种非常好的方法,可以根据一个看似理想的问题的谓词将数据分成两组。

它会像这样工作:

List<Integer> myDigits;
Map<Boolean, List<Integer>> evenMap = myDigits.stream()
    .collect(Collectors.partitioningBy(n -> n % 2 == 0);

您现在有两个数字列表:evenMap.get(true)evenMap.get(false)分别为偶数和奇数。

将它们分成两列打印并不困难。唯一困难的部分是应对两个清单中较短的一个。一旦你有Map,就可以使用evenMap.values().stream().map(List::size).max().orElse(0)来推导更长列表的长度。

如果您只是学习Java,我希望这不会太混乱,但我认为值得习惯使用Stream,因为它是一个非常强大且有用的结构。

答案 2 :(得分:0)

尝试这样

 public static void main(String[] args) 
 {
    int num;
    ArrayList<String> odd = new ArrayList<>();
    ArrayList<String> even = new ArrayList<>();

    System.out.println("Odd\tEven");
    for (int cntr = 0; cntr < 5; cntr++)
    {
        String var = JOptionPane.showInputDialog("Input Number: ");
        num = Integer.parseInt(var);

        if (num%2 == 0)
        {
            even.add(Integer.toString(num));
        }else
        {
            odd.add(Integer.toString(num));
        }
    }

    if (odd.size() > even.size())
    {
        while (even.size() < odd.size())
        {
            even.add("/");
        }
    }
    else if (odd.size() < even.size())
    {
        while (odd.size() < even.size())
        {
            odd.add("/");
        }
    }

    for (int i = 0; i<even.size(); i++) 
    {
        if (!odd.get(i).equals("/"))
        {
            System.out.print(odd.get(i));
        }
        if (!even.get(i).equals("/"))
        {
            System.out.print("\t" + even.get(i));
        }
        System.out.println();
    }

 }

您将数字作为字符串保存到ArrayList中,然后ArrayList需要具有相同的大小,因为我们将只使用一个循环。因此,为了使它们具有相同的尺寸,我们用&#34; /&#34;填充它们,如果&#34; /&#34;当我们打印数字时出现,然后我们跳过该条目。希望有所帮助

编辑:我使用了字符串的ArrayList而不是整数的ArrayList。因为,我无法用一些数字填充剩余的空格。当然,我可以使用Integer.MAX_VALUE或Integer.MIN_VALUE,但是用户可以输入该数字,然后当程序尝试输出数字时,则会跳过此数字。所以我使用了字符串,剩下的空间用了#34; /&#34;因为它不是一个数字。请在此程序中使用try-catch语句。特别是从String转换为int。