gpt4 book ai didi

Java数组: Unable to store new values into an array

转载 作者:行者123 更新时间:2023-11-30 08:04:37 25 4
gpt4 key购买 nike

我正在从无人机获取电池值。我能够在 JLabel 上显示新的电池值。但是,当我尝试将这些电池值存储到 int 数组中时,它仅存储数组中的第一个电池值。后续数组值将仅填充第一个电池值。

我显示了一个输出,以便您了解发生了什么。第一个值是从无人机获取的,第二个值表示数组索引。输出清楚地表明该数组由于未知原因无法接受新数据。

P/S:我不知道数组的最佳大小是多少,因为我每秒都从无人机获取值。所以我声明了一个大小为 9999999 的 int 数组。知道如何将数组设置为其最大大小以满足从无人机获取连续电池值的需求吗?这些值将用于稍后绘制图表。

我的代码:

public class arDroneFrame extends javax.swing.JFrame implements Runnable, DroneStatusChangeListener, NavDataListener {

private String text; // string for speech
private static final long CONNECT_TIMEOUT = 10000;
public ARDrone drone;
public NavData data;
public Timer timer = new Timer();
public int batteryGraphic=0;
public int [] arrayBatt = new int[9999999];

public arDroneFrame(String text) {
this.text=text;
}

public arDroneFrame() {
initComponents();
initDrone();
}

private void initDrone() {
try {
drone = new ARDrone();
data = new NavData();
} catch (UnknownHostException ex) {
return;
}
videoDrone.setDrone(drone);
drone.addNavDataListener(this);
}

public void navDataReceived(NavData nd) {
getNavData(nd);
int battery = nd.getBattery();
cmdListOK.jlblBatteryLevelValue.setText(battery + " %");
//JLabel can get updated & always display new battery values
}

public void getNavData(NavData nd){
for(int i=0;i<arrayBatt.length;i++){
batteryGraphic= nd.getBattery();
arrayBatt[i] = batteryGraphic;
System.err.println("This is stored battery values : " + arrayBatt[i] + " " + i + "\n");
}
}
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {

String text = "Welcome!";
arDroneFrame freeTTS = new arDroneFrame(text);
freeTTS.speak();

new arDroneFrame().setVisible(true);
}
});
}

结果:

This is stored battery values : 39   0

This is stored battery values : 39 1

This is stored battery values : 39 2

This is stored battery values : 39 3

This is stored battery values : 39 4

This is stored battery values : 39 5

最佳答案

问题出在这个方法上:

public void getNavData(NavData nd){
for (int batteryValue : arrayBatt){
arrayBatt[i] = nd.getBattery();
System.err.println("This is stored battery values : " + arrayBatt[i] + " " + i + "\n");
}
}

您可以通过向该方法传递一个 NavData 实例来调用该方法。这意味着,当循环在电池数组上进行交互时,nd 包含的 nd.getBattery() 值将被分配给数组中的每个索引。

您应该做的是将循环移到 getNavData(NavData nd) 方法之外,并为每次调用传递一个新的 NavData 实例。当您将此与下面的 ArrayList 建议结合使用时,您应该拥有一个包含不同电池值的动态数组

<小时/>

侧面解决方案

声明此数组的方式非常可怕。您应该只使用您需要的空间,仅此而已。我知道您不确定实际需要什么尺寸,但不要太过分。

你应该用更小的东西来初始化你的数组;

public int [] arrayBatt = new int[10000];

附注:一般不建议将类(class)成员设置为 public。您应该将它们设为私有(private)并创建 getter/setter 方法来分别检索和修改数据。

然后,有一个方法来检查数组是否已满。如果已满,则将数组大小增加 n/2,其中 n 是数组的初始大小。

这种方法的缺点是,随着数组变得更大,您将花费大量时间将旧数组复制到新数组,这是非常不可取的。

更好的解决方案

将使用内置的 ArrayList 库,然后只需将项目附加到列表中并让 Java 完成繁重的工作。

ArrayList<Integer> batteryArray = new ArrayList <Integer>();

您只需调用即可将项目添加到列表中:

batteryArray.add(item);

此解决方案的优点是:

  1. batteryArray 大小在幕后处理
  2. 数组的大小以及元素都很容易检索
  3. ArrayList 是一种非常快的存储结构。
<小时/>

在打印电池值的循环中,您可以通过实现 for-each 循环使其更加简洁。

  • 为什么使用 System.err 打印电池对话框?这不是 System.err 的用途,并且违反了 Principle of Least Astonishment

    public void getNavData(NavData nd){
    for (int batteryValue : arrayBatt){
    arrayBatt[i] = nd.getBattery();
    System.err.println("This is stored battery values : " + arrayBatt[i] + " " + i + "\n");
    }

    }

关于Java数组: Unable to store new values into an array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com