4

我想知道是否可以在字符串数组上存储字符串变量?我不能很好地解释它,但这是我所做的:

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

不幸的是,当我使用 for 循环时,str 得到 st1 和 st2 和 st3 ans 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[] 的值传输到 3 个字符串,即存储在 getContainsValue[] 中的 strHi、strHello、strThere。然后使用 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

您可以使用枚举类作为所需的数组:

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

请参阅有效的 Java使用枚举

于 2012-08-10T07:03:37.633 回答
2

您正在寻找的概念是“左值”。简而言之,当您使用变量时,您是在使用变量中包含的值,还是在谈论变量本身以便您可以在其中存储其他内容?您希望您调用的数组具有、和getContainsValue的左值。不幸的是,在 Java 中没有办法做到这一点。用、和初始化,并使用这些变量的,而不是它们的l-valuesstrHistrHellostrTheregetContainsValuestrHistrHellostrThere

让我们退后一步,多谈谈左值与值(有时是右值)。考虑以下代码片段:

int i = 17;
i = i + 1;

第二行显然不是一个等式。那将是荒谬的。相反,它是一个任务。赋值左边和右边的i的含义是不同的。在右侧,i表示使用该变量的值,在本例中为 17。在左侧,i表示变量本身,作为存储值的目的地。尽管它们看起来相同,但在右侧使用i是为了它的值(更具体地说,是它的r-value),而在左侧使用i是为了它的l-value

在 Java 中,无法在数组初始值设定项中表达变量的左值,因此您尝试执行的操作不起作用。正如其他人指出的那样,在 C 等其他语言中,通过使用 & (地址)运算符,这是可能的。

由于 Java 表达左值的方式有限,通常“存放东西的地方”的概念是通过对对象的引用来表达的。然后可以使用此引用来存储该对象的字段或调用该对象的方法

假设我们有一个这样的类:

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 回答
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 回答
1

最好的事情可能是使用 Map 并存储为键值对。

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 回答
1

我认为你应该使用Collectionlike Map

Map用于以Key-ValuePairs的形式存储数据。

假设在您的情况下,键是字符串,值也是字符串。

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 回答
0

如果我理解您的问题,您希望能够通过首先在数组中查找它然后进行分配来分配一个常规的 String 变量。

我同意其他响应者的观点,如果您认为这种方法是必要的,那可能是不明智的。但本着纯问答的精神,方法如下:

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

我确实同意这里的其他答案,这感觉像是某种解决方法,但在不知道那是什么的情况下,我无法提出更好的建议。

但是,要回答这个问题:但是,您可以将字符串包装在简单的类中,并将该类的对象引用存储在您的数组中和strHi、、strHellostrThere。这样,即使您更改了类中的字符串属性,类对象本身也不会改变,因此您将看到您正在寻找的行为。


或者,您可以按照其他人的建议使用 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++ 地址运算符 ( &) ... 或者 Perl 使用字符串作为变量名的能力。Java 中都不支持这些。

理论上,如果变量所在的实例变量,你可以使用反射来访问和更新它们。但是执行此操作的代码混乱、低效且脆弱。它不适用于局部变量。


您最好为问题寻找不同的解决方案;例如,正如其他答案所建议的那样,使用地图。

或者只是满足于一些使用开关或一系列if else if测试和原始变量的笨重(但健壮且相当高效)的代码。

于 2012-08-10T04:36:13.047 回答