【问题标题】:How to stop printing all iterations and only show true ones如何停止打印所有迭代并只显示真实的迭代
【发布时间】:2018-01-30 01:05:55
【问题描述】:
import java.util.ArrayList; 
import java.util.Scanner; 
import java.util.Collections; 

public class JMUnit2Ch10
{
    public static void main(String[] args)
    {
        ArrayList<Integer> randomNumbers = new ArrayList<>(); 

        System.out.print("How many random numbers between 1 and 100:");
        Scanner stdIn = new Scanner(System.in); 
        int numOfNumbers = stdIn.nextInt(); 

        for(int i=0; i<numOfNumbers; i++)
        {
            randomNumbers.add((int)(Math.random()*100)+1);  
        }

        System.out.print("Which random number are your searching for?:"); 
        int searchNumber = stdIn.nextInt(); 
        System.out.printf("%n");
        for(int a: randomNumbers)
        {
            System.out.println("Unsorted List");
            System.out.println(searchNumber + " found at location: "+ randomNumbers.indexOf(searchNumber)); 
        }
        Collections.sort(randomNumbers);

        for(int b:randomNumbers)
        {
            System.out.println("Sorted List");
            System.out.println(searchNumber + " found at location: "+ randomNumbers.indexOf(searchNumber));  
        }
        System.out.println(randomNumbers.stream().mapToInt(value -> value).sum()); 
    }
}

我尝试使用布尔值来仅显示我使用的代码是否为:

 boolean found = false;

然后在我输入的两个打印语句中:

found=true; 

在底部放置:

if(!found)
{
    System.out.println(randomNumbers.stream().mapToInt(value -> value).sum());
}

并且仍然为每个循环的每次迭代获得输出。我想要做的是在ArrayList 中为每个时间获取单个输出,该数字出现在已排序和未排序的ArrayLists 中,然后是数组列表中所有数字的总和。

Edit1:我得到的当前输出是searchNumber,它代表有多少个数字,所以它输出x 的时间量,其中xnumOfNumers。我希望它只输出它在两个数组中出现的次数。 编辑2: 由于建议我不要使用图片,因此我希望它显示: 1到100之间有多少个随机数:1000 你在搜索哪个随机数?:5

未排序的列表 5 发现地点:502 5 发现地点:725 5 发现地点:856 5 个在位置找到:924

排序列表 5 发现地点:40 5 发现地点:41 5 发现地点:42 5 个在位置找到:43

所有数字的总数:49089

我得到的是 未排序的列表 5 在位置 502 X1000 找到 排序列表 在位置 41 X1000 找到 5 个

所有数字的总数:42013

【问题讨论】:

  • "数字出现在排序和未排序的 ArrayLists 中" 嗯..两者都有相同的元素所以..只是顺序不同,你是什么意思?
  • 我将发布所需与当前的图片以供进一步澄清@azro
  • “我将发布想要的与当前的图片以供进一步澄清” 请不要,不需要图片。您可以根据需要编写文本作为输出...

标签: java loops arraylist foreach iteration


【解决方案1】:

您需要添加一个条件来检查当前数字(a 或 b)是否等于 searchNumber。但是,当发现一个事件时,您现在尝试打印randomNumbers.indexOf(searchNumber)。这将为每次出现返回相同的数字,即第一次出现的索引。这样做的唯一方法是使用for (int i = 0; i &lt; randomNumbers.size(); i++) 循环或使用计数器。

我还会将“未排序列表”和“排序列表”放在循环上方,以便这些行只打印一次。

如果您使用for (int i = 0; i &lt; randomNumbers.size(); i++),您的代码将如下所示:

    System.out.println("Unsorted List");
    for (int i = 0; i < randomNumbers.size(); i++) {
        if (randomNumbers.get(i) == searchNumber) {
            System.out.println(searchNumber + " found at location: " + i);
        }
    }
    Collections.sort(randomNumbers);

    System.out.println("Sorted List");
    for (int i = 0; i < randomNumbers.size(); i++) {
        if (randomNumbers.get(i) == searchNumber) {
            System.out.println(searchNumber + " found at location: " + i);
        }
    }

或者如果你想使用计数器:

    int loc = 0;
    System.out.println("Unsorted List");
    for(int a : randomNumbers) {
        if (searchNumber == a) {
            System.out.println(searchNumber + " found at location: "+ loc);
        }
        loc++;
    }
    Collections.sort(randomNumbers);

    loc = 0;
    System.out.println("Sorted List");
    for(int b : randomNumbers) {
        if (searchNumber == b) {
            System.out.println(searchNumber + " found at location: " + loc);
        }
        loc++;
    }

【讨论】:

  • 效果很好。您说“或使用计数器”。作业希望我为每个循环使用一个我可以使用一个计数器并完成同样的事情吗?
  • 第二段代码使用计数器,应该产生相同的结果。
  • 第二个正是分配调用 for each 循环所需要的,尽管它需要更多的工作并且使用 for 循环更有意义。
【解决方案2】:

我想要做的是每次在 ArrayList 表示数字同时出现在已排序和未排序中 ArrayLists 然后是数组列表中所有数字的总和。

只需添加if条件,如下所示:

for(int a: randomNumbers)
{
    System.out.println("Unsorted List");
    if(a == searchNumber)
    {
        System.out.println(searchNumber + 
            " found at location: "+ randomNumbers.indexOf(searchNumber));

    }
}

【讨论】:

  • 尝试了您建议的更改,但即使我做了 100,000 个介于 1-100 之间的随机数,也只能显示一个值,5 仅在我确定它出现的次数更多时才显示一次。跨度>
【解决方案3】:

我认为你的问题出在这里:

int searchNumber = stdIn.nextInt();
for(int a: randomNumbers)
{
    System.out.println("Unsorted List");
    System.out.println(searchNumber + " found at location: "+ randomNumbers.indexOf(searchNumber)); 
}
Collections.sort(randomNumbers);

for(int b:randomNumbers)
{
    System.out.println("Sorted List");
    System.out.println(searchNumber + " found at location: "+ randomNumbers.indexOf(searchNumber));  
}

您正在读取 searchNumber 中的一个数字,但从未使用它与 randomNumbers 中的数字进行比较,并且您正在打印数组中的每个数字。

因此,在两个 for-each 循环中,您可以:

if (searchNumber == a) {
    System.out.println(searchNumber + " found at location: "+ randomNumbers.indexOf(a));
}

b 变量也是如此。

我还会在循环之前放置:System.out.println("Unsorted List");...

所以,它应该是这样的:

System.out.println("Unsorted List");
for (int a : randomNumbers) {
    if (searchNumber == a) {
        System.out.println(searchNumber + " found at location: "+ randomNumbers.indexOf(a));
    }
}

Collections.sort(randomNumbers);
System.out.println("Sorted List");
for (int b : randomNumbers) {
    if (searchNumber == b) {
        System.out.println(searchNumber + " found at location: "+ randomNumbers.indexOf(b));
    }
}

编辑

感谢@ChrisWitteveen 指出这一点:

这里的一个问题是 randomNumbers.indexOf(a) 和 randomNumbers.indexOf(b) 总是返回相同的数字。

在这种情况下,您可以使用简单的 for 循环而不是 for-each 循环来简化代码:

将上述建议改为:

System.out.println("Unsorted List");
randomNumbers = new ArrayList<>(randomNumbers);
for (int i = 0; i < randomNumbers.size(); i++) {
    if (searchNumber == randomNumbers.get(i)) {
        System.out.println(searchNumber + " found at location: " + i);
    }
}

Collections.sort(randomNumbers);
System.out.println("Sorted List");
for (int i = 0; i < randomNumbers.size(); i++) {
    if (searchNumber == randomNumbers.get(i)) {
        System.out.println(searchNumber + " found at location: " + i);
    }
}

有什么诀窍吗,例如,为了测试目的,我尝试将随机生成从 1-100 更改为 1-10,我们得到以下输出,我还打印了整个数字列表,仅用于调试目的:

How many random numbers between 1 and 100:20
2
9
2
6
10
5
6
6
7
6
9
9
3
7
9
5
10
3
6
8
Which random number are your searching for?:2

Unsorted List
2 found at location: 0
2 found at location: 2
Sorted List
2 found at location: 0
2 found at location: 1
128

【讨论】:

  • 这里的一个问题是randomNumbers.indexOf(a)randomNumbers.indexOf(b) 总是返回相同的数字。
  • 运行良好,除了我认为 Chris Witteveen 说它每 7 次返回相同的位置。所以我假设它出现了 7 次,但它只显示第一个位置并将其镜像到所有其他位置。
  • @MichaelAnthonyJudge 请查看编辑,按需要工作:)
  • 感谢您对我的 stackoverflow 新手的帮助和耐心,这非常有效,但是对于每个带有计数器的人来说,就像 @ChrisWitteveen 上面所做的那样。
  • @MichaelAnthonyJudge 不用担心,至少我认为你学到了一些东西 :) 这很重要
猜你喜欢
  • 2020-10-24
  • 2012-08-27
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多