Java'da dinamik adlara sahip değişkenler atama


96

Java'da aşağıdaki gibi bir dizi değişken atamak istiyorum:

int n1,n2,n3;

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

Bunu Java'da nasıl başarabilirim?


1
Lütfen sorunuza açıklık getirir misiniz?
Eng.Fouad

4
Bunu yerel değişkenler için yapmanız gerekiyor mu? Neden dizi elemanları değil?
Ray Toal

@ Eng.Fouad: Değişkenlere dinamik olarak isimleriyle erişmek istiyorum.
Ashish Anand

Yanıtlar:


111

Java'da işler böyle yapmaz. Java'da dinamik değişkenler yoktur. Java değişkenleri kaynak kodu 1'de belirtilmelidir .

Neyi başarmaya çalıştığınıza bağlı olarak bir dizi, a Listveya a kullanmalısınız Map; Örneğin

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

Kaynak kodda bildirilen değişkenlere dinamik olarak başvurmak için yansıma kullanmak mümkündür . Ancak, bu yalnızca sınıf üyesi olan değişkenler (yani statik ve örnek alanlar) için çalışır. Yerel değişkenler için çalışmaz. @ Fyr'nin "hızlı ve kirli" örneğine bakın.

Ancak bu tür şeyleri gereksiz yere Java'da yapmak kötü bir fikirdir. Verimsizdir, kod daha karmaşıktır ve çalışma zamanı kontrolüne güvendiğiniz için daha kırılgandır. Ve bu "dinamik adlara sahip değişkenler" değildir. Statik adlara sahip değişkenlere dinamik erişim olarak daha iyi tanımlanır.


1 - Bu ifade biraz yanlış. BCEL veya ASM kullanıyorsanız, değişkenleri bayt kodu dosyasında "bildirebilirsiniz". Ama bunu yapma! Bu yol deliliktir!


1
Çok teşekkürler, aradığımı aldım. Son kısım (Harita <Dize, tamsayı>).
Ashish Anand

1
Mümkün olsa bile, aslında yapacağınız bir şey olmaması gerektiği unutulmamalıdır. Ondan hiçbir şey kazanmazsınız; okunabilirliği gerçekten kaybedersiniz. Onları bağlamak istiyorsanız, Map<String, T>bunun yerine bir kullanın, gerçek kodunuzla uğraşmaya başlamayın.
Jeroen Vannevel

2
@JeroenVannevel - "Delilik" ile kastettiğim buydu :-)
Stephen C

35

Değişkenlere bir çeşit dinamik erişmek istiyorsanız, yansımayı kullanabilirsiniz. Ancak Yansıma yerel değişkenler için işe yaramaz. Yalnızca sınıf nitelikleri için geçerlidir.

Kaba, hızlı ve kirli bir örnek şudur:

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

Bu kodu çeşitli şekillerde geliştirmeniz gerekir, bu sadece bir örnektir. Bu aynı zamanda iyi bir kod olarak kabul edilmez.


3
Android'in sensör event.values ​​[] değerini bir dizi değişkene dönüştürmeniz gerektiğinde mükemmeldir. event.values ​​[], 1'den 6'ya kadar bir uzunluğa sahip olabilir ve benim durumumda bir dizisiz json sıralaması için dönüştürmek kullanışlıdır.
Farshid T

12

İhtiyacınız olan şeyin adı dizi. Aşağıdaki kodu yazmak istedim:

int[] n = new int[4];

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

1
Dizileri kullanmak istemiyorum. Bazı koşullara bağlı olarak değişkenlere (n1, n2, n3) dinamik olarak erişmek istiyorum.
Ashish Anand

10

ListVeya arraybunun yerine kullanmalısınız

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

Veya

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

Hatta daha iyisi

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");

7

Java'da Dinamik Değişken Adları
Böyle bir şey yoktur.

Sizin durumunuzda dizi kullanabilirsiniz:

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

Daha genel (name, value)çiftler için kullanınMap<>


4

Şu yolu deneyin:

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

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

4

Yapmıyorsun. Yapabileceğiniz en yakın şey, onu simüle etmek için Haritalar ile çalışmak veya başa çıkmak için kendi Nesnelerinizi tanımlamaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.