0

動的配列の作成とこれらの配列の反復処理について質問があります。文字列と double 値をパラメーターとして受け取るメソッド setVoltage があります。これらの値を保存する何らかの方法が必要だったので、2 つの配列を作成しました。私がする必要があるのは、文字列配列を反復処理して、文字列パラメーターが既に存在するかどうかを確認し、存在する場合は、そのインデックスに対応する電圧を設定することです。存在しない場合は、文字列デバイスを文字列配列に追加し、二重電圧を二重配列に追加する必要があります。誰かが私のコードをチェックアウトして、私が欠けているものを見ることができますか? 文字列が既に配列内にあることを配列に認識させるか、配列の最後に追加する必要があるため、問題が発生していますが、これを達成するためにインデックス変数を使用する方法にこだわっています。ありがとうございました!

    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);
}

パフォーマンスはアレイのパフォーマンスを上回り、ハードコーディングされたデバイス数の制限はありません。

MapJDK の他のタイプのマップへのリンクについては、一般的なドキュメントを参照してください。

ConcurrentHashMapより細かい同期粒度が必要かどうか、および/または許容できるかどうかも確認してください。

配列を使用する必要がある場合の代替手段はDevice、デバイスに関するすべての関連情報をカプセル化するクラスを作成し、単一の配列を使用してロジックを簡素化することです。次に例を示します。

static class Device {
    String name; 
    double voltage;
}

Device[] devices = new Device[10];

null配列内の要素を置き換えることで、新しいデバイスを追加できます。指定した名前のデバイスを見つけてそのvoltageフィールドを変更することで、デバイスを更新できます。オプションで a を使用しList<Device>て、ハードコーディングされたサイズ制限を回避できます。

于 2013-11-15T08:04:01.517 に答える
0

Map<String,Double>このシナリオでは a を使用する方がはるかに優れています。しかし、それでも 2 つの配列を使用したい場合、現在のコードは配列の末尾に追加されていません。if i=0and と言うと、コードは配列の末尾に追加するのではなく、ブロック内の新しい値でdeviceList[i] != deviceすぐに上書きします。追加するには、else 部分のコードを の後に移動する必要があります。deviceList[i]elsefor loop

于 2013-11-15T08:09:18.383 に答える