我想知道是否可以在String数组上存储String变量? 我不能很好地解释它,但这就是我做的:
String st1 = "",st2 = "",st3 = "",st4 = "";
String[] str = {st1,st2,st3,st4};
不幸的是,当我使用for循环时,str获取st1和st2以及st3和st4的值而不是它自己的变量..
这就是我想要完全按照我的想法做的事情。 每当有一个String数组时,例如:
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个String,它是存储在getContainsValue []中的strHi,strHello,strThere。然后使用for循环来对它们赋值来自containsValue []。 这是真的吗?如果是这样,那么你可以给我一些格式怎么做?感谢..
答案 0 :(得分: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"));
答案 1 :(得分: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
请参阅Effective Java使用枚举
答案 2 :(得分:2)
您正在寻找的概念是“l值”。简而言之,当您使用变量时,您是使用变量中包含的值,还是在谈论变量本身,以便您可以在其中存储其他内容?您希望调用getContainsValue
的数组具有strHi
,strHello
和strThere
的l值。不幸的是,在Java中无法做到这一点。使用getContainsValue
,strHi
和strHello
初始化strThere
会使用这些变量的值,而不是 l-values
让我们退后一步,更多地讨论l值与值(有时是r值)。请考虑以下代码段:
int i = 17;
i = i + 1;
第二行显然不是一个等式;这将是荒谬的。相反,它是作业。赋值左侧和右侧的 i 含义不同。在右侧, i 表示使用该变量的值,在本例中为17.在左侧, i 表示变量本身,作为目的地用于存储值。即使它们看起来相同,但在右侧使用 i 是为了它的价值(更具体地说,它的 r值)和 i 左侧是 l-value 。
在Java中,无法在数组初始值设定项中表示变量的l值,因此您尝试执行的操作不起作用。正如其他人所指出的那样,在其他语言中,例如C,这是可能的,通过使用&amp; (地址)运营商。
由于Java表达l值的方式有限,通常“存储某物的地方”的概念是通过对象的引用来表达的。然后,可以使用此引用存储到该对象的字段或在该对象上调用方法。
假设我们有这样一个类:
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]);
}
答案 3 :(得分: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");
}
答案 4 :(得分:1)
最好的事情可能是使用Map和store作为键值对。
Map<String,String> myKVMap=new HashMap<String,String>();
myKVMap.put("strHi","value1");
myKVMap.put("strHello","value2");
myKVMap.put("strThere","value3");
这样您就可以消除所有变量名称和值问题。
答案 5 :(得分:1)
我认为你应该像Collection
一样使用Map
。
地图用于以Key-Value
对的形式存储数据。
假设Key是String,而Value也是一个String。
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());
}
答案 6 :(得分: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;
}
答案 7 :(得分:0)
如果我理解你的问题,你希望能够通过先在数组中查找然后进行分配来分配常规的String变量。
我同意其他响应者的意见,如果你发现这种方法是必要的,那可能是不明智的。但是在纯粹的Q&amp; 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] );
}
说不。
答案 8 :(得分:0)
我同意这里的其他答案,这感觉就像是一种解决方法,但不知道那是什么东西我不能建议更好。
回答这个问题,但是:你可以将字符串包装在简单的类中,并将该类的对象引用存储在数组中strHi
,strHello
和{{1} }。这样,即使您更改了类中的字符串属性,类对象本身也不会更改,因此您将看到您要查找的行为。
或者,您可以像其他人建议的那样使用HashMap。在您的情况下,如果您仍想使用strThere
数组,则可以存储密钥:
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")
。
答案 9 :(得分:0)
没有简单的方法可以用Java做你想做的事情。你需要的是等效的C / C ++地址 - 运算符(&
)...或者Perl能够使用字符串作为变量名。 Java中都不支持这些。
理论上,如果实例变量的变量,你可以使用反射来访问和更新它们。但是这样做的代码是混乱,低效和脆弱的。它不会使用局部变量。
你最好寻找一个不同的问题解决方案;例如使用地图,正如其他答案所暗示的那样。
或者只是满足于使用一系列if else if
测试和原始变量的一些笨重但强大且合理有效的代码。