【问题标题】:Java: Simple array splitting programJava:简单的数组拆分程序
【发布时间】:2020-01-03 16:17:02
【问题描述】:

我正在尝试制作一个简单的 Java 程序,您首先输入 15 个数字(整数、正数和负数),假设这些将被加载到 arrayOne。之后,所有低于“-5”的数字都需要加载到第二个数组(arrayTwo)中。我想打印 arrayTwo 的所有数字,同时仍保留所有 arrayOne 数字。

我知道我的代码根本没有任何意义,因为我还是一个初学者(大约一个月的时间)。到目前为止,这是我的代码:

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        int[] arrayOne = new int[15];
        int count = 0;

        System.out.println("Input 15 ints:  ");

        for (int i = 0; i <= arrayOne.length-1; i++){
            arrayOne[i] = scanner.nextInt();
            if (arrayOne[i] < -5){
                count++;
            }
        }

        int[] arrayTwo = new int[count];

        for (int i = 0; i <= arrayOne.length-1; i++){
            if (arrayOne[i] < -5){
                arrayOne[i] = arrayTwo[i];
            }

        }


    }
}

这让我很困惑。老实说,我不知道该怎么做。我需要使用某种嵌套循环吗?

非常感谢您,任何帮助将不胜感激。

【问题讨论】:

  • 我建议你花一些时间来学习如何调试你自己的代码。这将帮助您了解您的代码实际在做什么,并了解它与您编写它时的想法有何不同。它还将帮助您在将来避免同样的错误。查看this article 了解开始调试代码的一些技巧。
  • Eclipse 和 Netbeans 等 IDE 可让您逐步执行代码并检查变量,从而更轻松地查看正在发生的事情。
  • 在最后一个 for 循环中,您必须更改行 arrayOne[i] = arrayTwo[i];到 arrayTwo[i] = arrayOne[i]; ,因为 arrayTwo 将包含

标签: java loops for-loop


【解决方案1】:
int[] arrayTwo = new int[count];
int index = 0;
for (int i = 0; i <= arrayOne.length-1; i++){
    if (arrayOne[i] < -5){
         arrayTwo[index++] = arrayOne[i];
    }
}

index 将用于写入第二个数组。

index++ 是后缀自增运算符。你可以在这里阅读 - Java: Prefix/postfix of increment/decrement operators?

你做错了任务。必须是 arrayTwo[..] = arrayOne[..] 才能将 arrayOne 中的值分配给 arrayTwo

【讨论】:

    【解决方案2】:

    arrayOne 中有 15 个整数。但在arrayTwo 中有低于-5 的整数。 那么您必须了解arrayTwo 的大小小于(在许多情况下)或等于arrayTwo 的大小。原因是-5 以下的整数是整数的子集。 因此,对两个数组使用 while 循环使用相同的迭代器会出错。

    改为使用第二个 for 循环,修改代码如下,

    int indexArrayOne = 0, 
    indexArrayTwo=0;
    
    while(indexArrayOne < arrayOne.length){
        if(arrayOne[indexArrayOne] < -5){
           arrayTwo[indexArrayTwo++] = arrayOne[indexArrayOne];
        }
        indexArrayOne++;
    }
    

    您可以像为此所做的那样使用 for 循环。想法是您必须对两个数组使用两个迭代器。

    【讨论】:

      【解决方案3】:

      我知道我的代码根本没有任何意义,因为我还是个初学者

      您无需为自己是初学者而道歉。我们都去过一次。您的代码具有一般正确的想法。您只是遗漏了几个关键概念。

      看看这一行:

      arrayOne[i] = arrayTwo[i];
      

      您正在将值从 arrayTwo 分配到 arrayOne。但是,从您所说的情况来看,您希望反过来:

      arrayTwo[i] = arrayOne[i];
      

      但是现在您正在分配给arrayTwo 中的相同索引,因为您正在从arrayOne 中读取。这将留下0 值,其中arrayOne 中的原始值大于-5。我怀疑这是你想要的。

      相反,您应该为每个数组使用两个单独的索引。也许i1i2。这些将独立增加。也就是说i1 将始终在for 循环中递增,因为您正在跨过arrayOne 的元素。但是i2 应该只在您将值写入arrayTwo 时增加。

      【讨论】:

        【解决方案4】:

        对arrayTwo 使用ArrayList,这样您就可以在一个for 循环中拥有arrayTwo 中的所有元素。

        List<Integer> arrayTwo = new ArrayList<>();
        
        for (int i = 0; i <= arrayOne.length-1; i++){
            if (arrayOne[i] < -5){
                arrayTwo.add(arrayTwo[i]);
            }
         }
        

        您可以在此代码中使用流和 lambda。但首先您必须学习 Stream API 和 lambda

        【讨论】:

          猜你喜欢
          • 2015-01-17
          • 1970-01-01
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-28
          相关资源
          最近更新 更多