ฉันต้องการกำหนดชุดของตัวแปรใน java ดังนี้:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
ฉันจะบรรลุสิ่งนี้ใน Java ได้อย่างไร
ฉันต้องการกำหนดชุดของตัวแปรใน java ดังนี้:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
ฉันจะบรรลุสิ่งนี้ใน Java ได้อย่างไร
คำตอบ:
นี่ไม่ใช่วิธีที่คุณทำใน Java ไม่มีตัวแปรไดนามิกใน Java ตัวแปร Java จะต้องมีการประกาศในซอร์สโค้ด1
ขึ้นอยู่กับสิ่งที่คุณพยายามจะบรรลุคุณควรใช้อาร์เรย์ a List
หรือ a Map
; เช่น
int n[] = new int[3];
for (int i = 0; i < 3; i++) {
n[i] = 5;
}
List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
n.add(5);
}
Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
n.put("n" + i, 5);
}
เป็นไปได้ที่จะใช้การสะท้อนเพื่ออ้างถึงตัวแปรที่ประกาศในซอร์สโค้ดแบบไดนามิก แต่นี้เท่านั้นทำงานสำหรับตัวแปรที่เป็นสมาชิกระดับ (เช่นแบบคงที่และเขตเป็นต้น) ใช้ไม่ได้กับตัวแปรภายใน ดูตัวอย่าง "รวดเร็วและสกปรก" ของ @ fyr
อย่างไรก็ตามการทำสิ่งนี้โดยไม่จำเป็นใน Java เป็นความคิดที่ไม่ดี ไม่มีประสิทธิภาพโค้ดมีความซับซ้อนมากขึ้นและเนื่องจากคุณต้องอาศัยการตรวจสอบรันไทม์จึงเปราะบางกว่า และนี่ไม่ใช่ "ตัวแปรที่มีชื่อไดนามิก" อธิบายได้ดีกว่าว่าเป็นการเข้าถึงตัวแปรที่มีชื่อคงที่แบบไดนามิก
1 - ข้อความนั้นไม่ถูกต้องเล็กน้อย หากคุณใช้ BCEL หรือ ASM คุณสามารถ "ประกาศ" ตัวแปรในไฟล์ bytecode แต่อย่าทำ! แบบนั้นบ้า!
Map<String, T>
แทนอย่าเริ่มยุ่งกับรหัสจริงของคุณ
หากคุณต้องการเข้าถึงตัวแปรแบบไดนามิกบางประเภทคุณอาจใช้การสะท้อน อย่างไรก็ตามการสะท้อนกลับไม่ทำงานสำหรับตัวแปรท้องถิ่น ใช้ได้กับแอตทริบิวต์คลาสเท่านั้น
ตัวอย่างคร่าวๆที่รวดเร็วและสกปรกมีดังนี้:
public class T {
public Integer n1;
public Integer n2;
public Integer n3;
public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
NoSuchFieldException {
for (int i = 1; i < 4; i++) {
T.class.getField("n" + i).set(this, 5);
}
}
}
คุณต้องปรับปรุงโค้ดนี้ด้วยวิธีต่างๆซึ่งเป็นเพียงตัวอย่างเท่านั้น นอกจากนี้ยังไม่ถือว่าเป็นรหัสที่ดี
สิ่งที่คุณต้องการคือชื่อ array ฉันต้องการเขียนโค้ดต่อไปนี้:
int[] n = new int[4];
for(int i=1;i<4;i++)
{
n[i] = 5;
}
คุณควรใช้List
หรือarray
แทน
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
หรือ
int[] arr = new int[10];
arr[0]=1;
arr[1]=2;
หรือดียิ่งขึ้น
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);
//conditionally get
map.get("n1");
Dynamic Variable Names ใน Java
ไม่มีสิ่งนี้
ในกรณีของคุณคุณสามารถใช้อาร์เรย์:
int[] n = new int[3];
for() {
n[i] = 5;
}
สำหรับ(name, value)
คู่ทั่วไปให้ใช้Map<>
ลองวิธีนี้:
HashMap<String, Integer> hashMap = new HashMap();
for (int i=1; i<=3; i++) {
hashMap.put("n" + i, 5);
}
คุณไม่ทำ สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือการทำงานกับแผนที่เพื่อจำลองหรือกำหนดวัตถุของคุณเองที่จะจัดการ