การกำหนดตัวแปรด้วยชื่อไดนามิกใน Java


96

ฉันต้องการกำหนดชุดของตัวแปรใน java ดังนี้:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

ฉันจะบรรลุสิ่งนี้ใน Java ได้อย่างไร


1
คุณช่วยชี้แจงคำถามของคุณได้ไหม
Eng.Fouad

4
คุณต้องทำสิ่งนี้สำหรับตัวแปรท้องถิ่น? ทำไมไม่ใช้องค์ประกอบอาร์เรย์
Ray Toal

@ Eng.Fouad: ฉันต้องการเข้าถึงตัวแปรตามชื่อแบบไดนามิก
Ashish Anand

@Ashish Anand คุณหมายถึงstackoverflow.com/questions/6629995/…
mKorbel

คำตอบ:


111

นี่ไม่ใช่วิธีที่คุณทำใน 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 แต่อย่าทำ! แบบนั้นบ้า!


1
ขอบคุณมากมีสิ่งที่ฉันกำลังมองหา ส่วนสุดท้าย (แผนที่ <สตริงจำนวนเต็ม>)
Ashish Anand

1
ควรสังเกตว่าแม้ว่าจะเป็นไปได้ แต่ก็ไม่ควรเป็นสิ่งที่คุณจะทำจริงๆ คุณไม่ได้รับอะไรจากมัน คุณจะสูญเสียความสามารถในการอ่านไป หากคุณต้องการเชื่อมโยงให้ใช้ a Map<String, T>แทนอย่าเริ่มยุ่งกับรหัสจริงของคุณ
Jeroen Vannevel

2
@JeroenVannevel - นั่นคือสิ่งที่ฉันหมายถึง "ความบ้าคลั่ง" :-)
Stephen C

36

หากคุณต้องการเข้าถึงตัวแปรแบบไดนามิกบางประเภทคุณอาจใช้การสะท้อน อย่างไรก็ตามการสะท้อนกลับไม่ทำงานสำหรับตัวแปรท้องถิ่น ใช้ได้กับแอตทริบิวต์คลาสเท่านั้น

ตัวอย่างคร่าวๆที่รวดเร็วและสกปรกมีดังนี้:

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

คุณต้องปรับปรุงโค้ดนี้ด้วยวิธีต่างๆซึ่งเป็นเพียงตัวอย่างเท่านั้น นอกจากนี้ยังไม่ถือว่าเป็นรหัสที่ดี


3
ยอดเยี่ยมเมื่อคุณต้องแปลง sensor event.values ​​[] ของ Android เป็นชุดของตัวแปร event.values ​​[] อาจมีความยาวตั้งแต่ 1 ถึง 6 และสะดวกในการแปลงในกรณีของฉันสำหรับ json marshaling ที่ไม่มีอาร์เรย์
Farshid T

12

สิ่งที่คุณต้องการคือชื่อ array ฉันต้องการเขียนโค้ดต่อไปนี้:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}

1
ไม่ต้องการใช้อาร์เรย์ ฉันต้องการเข้าถึงตัวแปรแบบไดนามิก (n1, n2, n3) ขึ้นอยู่กับเงื่อนไขบางอย่าง
Ashish Anand

10

คุณควรใช้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");

7

Dynamic Variable Names ใน Java
ไม่มีสิ่งนี้

ในกรณีของคุณคุณสามารถใช้อาร์เรย์:

int[] n = new int[3];
for() {
 n[i] = 5;
}

สำหรับ(name, value)คู่ทั่วไปให้ใช้Map<>


4

ลองวิธีนี้:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

4

คุณไม่ทำ สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือการทำงานกับแผนที่เพื่อจำลองหรือกำหนดวัตถุของคุณเองที่จะจัดการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.