4

文字列変数を文字列配列に格納できるかどうか知りたいですか?私はそれをうまく説明することはできませんが、これが私がしていることです:

 String st1 = "",st2 = "",st3 = "",st4 = "";
 String[] str = {st1,st2,st3,st4};

残念ながら、forループを使用すると、strはst1とst2の値を取得し、st3とst4はそれ自体の変数ではありません。

これは私が私の頭の中で正確にやりたいことです。たとえば、文字列配列があるときはいつでも:

String[] containsValue = { "hi", "hello", "there" };

String strHi, strHello, strThere;
String[] getContainsValue = { strHi, strHello, strThere };

for (int x = 0; x < getContainsValue.length; x++) {
    getContainsValue[x] = containsValue[x];
}

The value of:
strHi = "hi"
strHello = "hello"
strThere = "there";

基本的に、containsValue []の値を、getContainsValue []に​​格納されているstrHi、strHello、strThereの3つの文字列に転送します。次に、forループを使用して値をcontainsValue[]から割り当てます。これは可能ですか?もしそうなら、それを行う方法を教えていただけますか?ありがとう..

4

10 に答える 10

10

使用できますMap<K,V>

Map<String,String> map=new HashMap<String,String>();
map.put("strHi","hi");
map.put("strHello","hello");
map.put("strThere","there");

System.out.println(map.get("strHello"));
于 2012-08-10T04:24:45.317 に答える
3

enum クラスを必要な配列として使用できます。

public enum EnumModifE {
    str1("1"), str2("2"), str3("3");
    String value;
    EnumModifE(final String s) {
        this.value = s;
    }
    public void setValue(final String s) {
        this.value = s;
    }
}
public class EnumModifM {
    public static void main(final String[] args) {
        for (final EnumModifE eme : EnumModifE.values()) {
            System.out.println(eme + "\t" + eme.value);
        }
        EnumModifE.str1.setValue("Hello");
        EnumModifE.str2.setValue("all");
        EnumModifE.str3.setValue("[wo]men");

        for (final EnumModifE eme : EnumModifE.values()) {
            System.out.println(eme + "\t" + eme.value);
        }
    }
}

出力

str1    1
str2    2
str3    3
str1    Hello
str2    all
str3    [wo]men

enumの効果的なJava使用

于 2012-08-10T07:03:37.633 に答える
2

まあこれは使えます。

Map<String,String> map = new HashMap<String,String>();
String[] str = {"hi","hello","there"};

for(int x = 0; x < str.lenght;x++){
map.put(str[x],"something you want to store");

}
于 2012-08-10T05:32:10.193 に答える
2

あなたが探している概念は「l-値」です。簡単に言えば、変数を使用している場合、変数に含まれている値を使用していますか、それとも変数自体について話しているので、変数に何か他のものを格納できますか? 、、およびgetContainsValueの左辺値を持つように呼び出している配列が必要です。残念ながら、Java でこれを行う方法はありません。、、およびで初期化すると、左辺値ではなく、これらの変数のが使用されますstrHistrHellostrTheregetContainsValuestrHistrHellostrThere

少し戻って、左辺値と値 (場合によっては右辺値) について詳しく説明しましょう。次のコード スニペットを検討してください。

int i = 17;
i = i + 1;

その 2 行目は明らかに方程式ではありません。それは無意味でしょう。代わりに、それは代入です。代入の左辺と右辺のiの意味は異なります。右側のiは、その変数の値 (この場合は 17) を使用することを意味します。左側のiは、値の保存先として変数自体を意味します。それらは同じように見えますが、右側のiの使用はその値 (より具体的にはr-value ) であり、左側のiの使用はそのl-valueです。

Java では、配列初期化子で変数の左辺値を表現する方法がないため、実行しようとしていることが機能しません。他の人が指摘したように、C のような他の言語では & (address-of) 演算子を使用することでこれが可能です。

Java では左辺値を表現する方法が限られているため、通常、「何かを格納する場所」の概念はobject への参照によって表現されます。この参照を使用して、そのオブジェクトのフィールドに格納したり、そのオブジェクトのメソッドを呼び出したりできます。

次のようなクラスがあるとします。

class MyContainer {
    String str;
    void setString(String s) { str = s; }
    String getString() { return str; }
}

次に、コードを書き直して、次のようなことを行うことができます。

String[] containsValue = { "hi", "hello", "there" };

MyContainer hiCont = new MyContainer();
MyContainer helloCont = new MyContainer();
MyContainer thereCont = new MyContainer();

MyContainer[] getContainsValue = { hiCont, helloCont, thereCont };

for (int x = 0; x < getContainsValue.length; x++) {
    getContainsValue[x].setString(containsValue[x]);
}
于 2012-08-10T05:16:46.417 に答える
1

Collectionのように使うべきだと思いますMap

Key-Valueマップは、ペアの形式でデータを格納するために使用されます。

あなたの場合、キーは文字列であり、値も文字列であると仮定します。

Map<String, String> mp = new Map<String, String>();

mp.put("str1","Hi");
mp.put("str2","Hello");

You can iterate over it like the below.

for(Map.Entry<String, String> ar : mp.entrySet()){

      System.out.println("Key: "+ar.getKey()+" :: "+"Value: "+ar.getValue());

 }
于 2012-08-10T04:47:40.113 に答える
1

マップを使用することをお勧めします。別のアプローチは、クラス変数をインスタンス化することです。そうすれば、値の割り当てが機能します。

public void testTransfer() {
    String containsValue[] = { "hi", "hello", "there" };
    Data strHi = new Data();
    Data strHello = new Data();
    Data strThere = new Data();
    Data[] getContainsValue = { strHi, strHello, strThere };
    for (int x = 0; x < getContainsValue.length; x++) {
        getContainsValue[x].value = containsValue[x];
    }
    // print out
    System.out.println(strHi.value);
    System.out.println(strHello.value);
    System.out.println(strThere.value);
}

class Data {
    private String value;
}
于 2012-08-10T04:51:02.863 に答える
1

最良の方法は、キーと値のペアとしてマップとストアを使用することです。

Map<String,String> myKVMap=new HashMap<String,String>();
myKVMap.put("strHi","value1");
myKVMap.put("strHello","value2");
myKVMap.put("strThere","value3");

このようにして、変数名と値の問題をすべて排除できます。

于 2012-08-10T04:28:32.067 に答える
0

私があなたの質問を理解している場合は、最初に配列で検索してから割り当てを行うことにより、通常の文字列変数を割り当てることができるようにしたいと考えています。

このアプローチが必要であると考えている場合、それはおそらく賢明ではないという他のレスポンダーに同意します。しかし、純粋な Q&A の精神で、ここに方法があります:

interface StringAssigner {
    void assign( String strValue );
}

// ...

String strHi, strHello, strThere;

StringAssigner[] asaGetContainsValue = {
    new StringAssigner() { @Override public void assign( String strValue ) { strHi = strValue; } },
    new StringAssigner() { @Override public void assign( String strValue ) { strHello = strValue; } },
    new StringAssigner() { @Override public void assign( String strValue ) { strThere = strValue; } }
};

// ...

for (int x = 0; x < asaGetContainsValue.length; x++) {
    asaGetContainsValue[x].assign( containsValue[x] );
}

いやだっていうだけだよ。

于 2012-08-10T04:34:45.823 に答える
0

ここでの他の回答には同意しますが、これは何かの回避策のように感じますが、その何かが何であるかを知らなければ、これ以上の提案はできません。

ただし、質問に答えるには: ただし、文字列を単純なクラスでラップし、そのクラスのオブジェクト参照を配列 and strHistrHello、およびに格納することはできますstrThere。このように、クラス内の文字列プロパティを変更しても、クラス オブジェクト自体は変更されないため、探している動作が表示されます。


または、他の人が提案したように HashMap を使用できます。それでも配列を使用したい場合はgetContainsValue、キーを保存できます。

Map<String,String> map = new HashMap<String,String>();
map.put("strHi","");
map.put("strHello","");
map.put("strThere","");

String[] containsValue = { "hi", "hello", "there" };
String[] getContainsValue = { "strHi", "strHello", "strThere" };

for (int x = 0; x < getContainsValue.length; x++) {
    map.put(getContainsValue[x], containsValue[x]);
}

その後、期待どおりmap.get("strHi")に戻り"hi"ます。

于 2012-08-10T04:34:55.053 に答える
0

Java でやりたいことを実行する簡単な方法はありません。必要なのは、C / C++ の address-of 演算子 ( &) に相当するものです... または、文字列を変数名として使用する Perl の機能かもしれません。これらはどちらも Java ではサポートされていません。

理論的には、変数がインスタンス変数の場合、リフレクションを使用してそれらにアクセスして更新できますしかし、これを行うためのコードは、ごちゃごちゃしていて、非効率的で、壊れやすいものです。また、ローカル変数では機能しません。


問題に対する別の解決策を探す方がよいでしょう。たとえば、他の回答が示唆しているように、マップを使用します。

if else ifまたは、スイッチまたは一連のテストと元の変数を使用する、不格好な (しかし堅牢でかなり効率的な) コードで妥協することもできます。

于 2012-08-10T04:36:13.047 に答える