我还是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);
问题在于,当你运行它时,输出是这样的,它排序的最高位数是赔率,然后底部数字是偶数,但它在奇数标题下对齐。
你能推荐什么?这里有新成员。很高兴见到你们!
答案 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。