0

我有一个关于创建动态数组和遍历这些数组的问题。我有一个方法 setVoltage,它以字符串和双精度值作为参数。我需要一些方法来存储这些值,所以我创建了两个数组。我需要做的是遍历字符串数组以查看字符串参数是否已经存在,如果存在,则在该索引处设置相应的电压。如果它不存在,我需要将字符串设备添加到字符串数组,并将双电压添加到双数组。有人可以查看我的代码并查看我缺少的内容吗?我遇到了麻烦,因为我希望数组意识到字符串已经在数组中,或者将其附加到数组的末尾,但我一直坚持如何使用索引变量来实现这一点。谢谢!

    public final int sizeArray = 10;
private String[] deviceList = new String[sizeArray]; 
public double[] voltList = new double[sizeArray];

public synchronized void setVoltage(String device, double voltage) {

        int index = 0;
        for(int i = 0; i < deviceList.length; i++ ){
            //if the device name already exists in the device array, overwrite voltage at that index 
            if(this.deviceList[i].equals(device)){
            index = i;
            voltList[index] = voltage;
            }else{
            //set deviceList[i] equal to device, set voltList[i] equal to voltage
            deviceList[i] = device;
            voltList[i] = voltage;
            index++;
            }
        }
}
4

4 回答 4

2

听起来你可能想要一个Map<String,Double>。这将让您存储按设备名称键入的电压值,并且您可以轻松查找、插入和移除设备。例如,参见HashMap

Map<String,Double> deviceVoltages = new HashMap<String,Double>(); 
deviceVoltages.put("liquifier", 8.4);
deviceVoltages.put("reflarbulator", 900.0);
deviceVoltages.put("liquifier", 13.3); // replaces previous 8.4
System.out.println(deviceVoltages.get("liquifier")); 
deviceVoltages.remove("reflarbulator");

您的示例代码然后简化为:

private Map<String,Double> deviceVoltages = new HashMap<String,Double>(); 

public synchronized void setVoltage(String device, double voltage) {
    deviceVoltages.put(device, voltage);
}

性能将超过您的阵列,并且您对设备数量没有硬编码限制。

有关 JDK 中其他类型映射的链接,请参阅通用Map文档。

另请参阅ConcurrentHashMap是否需要和/或可接受更精细的同步粒度。

如果您必须使用数组,另一种方法是创建一个Device封装有关设备的所有相关信息的类,并使用单个数组来简化您的逻辑,例如:

static class Device {
    String name; 
    double voltage;
}

Device[] devices = new Device[10];

您可以通过替换null数组中的元素来添加新设备。您可以通过查找具有指定名称的设备并更改其voltage字段来更新设备。您可以选择使用 aList<Device>来避免硬编码的大小限制。

于 2013-11-15T08:04:01.517 回答
0

Map<String,Double>在这种情况下使用 a 会更好。但是,如果您仍想使用两个数组,则您当前的代码不会附加到数组的末尾。说 ifi=0和,然后您的代码会立即用块中的新值deviceList[i] != device覆盖,而不是将其附加到数组的末尾。要追加,您必须将 else 部分中的代码移动到.deviceList[i]elsefor loop

于 2013-11-15T08:09:18.383 回答
0

如果未找到设备名称,您的代码将始终覆盖设备。如果您使用 Map 会更好,但如果您需要使用数组,您可以尝试以下操作

   for(int i = 0; i < deviceList.length; i++ ){
        //if the device name already exists in the device array, overwrite voltage at that index 
        if(this.deviceList[i].equals(device)){
          voltList[i] = voltage;
          break;
        }else if (deviceList[i] == null) {
          //set deviceList[i] equal to device, set voltList[i] equal to voltage
          deviceList[i] = device;
          voltList[i] = voltage;
          break;
        }
    }

您必须编写一些额外的代码来处理完整的数组。

于 2013-11-15T08:12:31.770 回答
0

我就是这样做的:

public void setOrAppend(String device, double voltage) {

    int index = 0;
    for ( ; index < deviceList.length; i++) {
        if (device.equals(deviceList[index]) || deviceList[index] == null) {
            break;
        }
    }

    if (index == deviceList.length) {
        deviceList = Arrays.copyOf(deviceList, deviceList.length + 1);
        voltList = Arrays.copyOf(voltList, voltList.length + 1);
    }

    deviceList[index] = device;
    voltList[index] = voltage;
}

我建议在循环之外执行设置逻辑。此外,我还会为这种场景推荐一个 Map,因为这种逻辑更简单。地图将自动执行您要求的操作(如果存在则替换,否则附加)。

于 2013-11-15T08:18:33.917 回答