Tôi muốn gán một tập hợp các biến trong java như sau:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Làm cách nào để đạt được điều này trong Java?
Tôi muốn gán một tập hợp các biến trong java như sau:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Làm cách nào để đạt được điều này trong Java?
Câu trả lời:
Đây không phải là cách bạn làm mọi thứ trong Java. Không có biến động nào trong Java. Các biến Java phải được khai báo trong mã nguồn 1 .
Tùy thuộc vào những gì bạn đang cố gắng đạt được, bạn nên sử dụng một mảng, a List
hoặc a Map
; ví dụ
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);
}
Có thể sử dụng phản xạ để tham chiếu động đến các biến đã được khai báo trong mã nguồn. Tuy nhiên, điều này chỉ hoạt động đối với các biến là thành viên lớp (tức là trường tĩnh và trường thể hiện). Nó không hoạt động đối với các biến cục bộ. Hãy xem ví dụ về "nhanh và bẩn" của @ fyr.
Tuy nhiên, làm điều này một cách không cần thiết trong Java là một ý tưởng tồi. Nó không hiệu quả, mã phức tạp hơn và vì bạn đang dựa vào việc kiểm tra thời gian chạy nên nó dễ hỏng hơn. Và đây không phải là "các biến có tên động". Nó được mô tả tốt hơn là truy cập động vào các biến có tên tĩnh.
1 - Tuyên bố đó hơi không chính xác. Nếu bạn sử dụng BCEL hoặc ASM, bạn có thể "khai báo" các biến trong tệp bytecode. Nhưng đừng làm vậy! Đó là sự điên rồ!
Map<String, T>
thay thế, đừng bắt đầu làm rối với mã thực của bạn.
Nếu bạn muốn truy cập các biến một số loại động, bạn có thể sử dụng phản xạ. Tuy nhiên Reflection không hoạt động đối với các biến cục bộ. Nó chỉ có thể áp dụng cho các thuộc tính của lớp.
Một ví dụ thô sơ và nhanh chóng là:
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);
}
}
}
Bạn cần cải thiện mã này theo nhiều cách khác nhau, nó chỉ là một ví dụ. Đây cũng không được coi là mã tốt.
Những gì bạn cần là mảng được đặt tên. Tôi muốn viết mã sau:
int[] n = new int[4];
for(int i=1;i<4;i++)
{
n[i] = 5;
}
Bạn nên sử dụng List
hoặc array
thay thế
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Hoặc là
int[] arr = new int[10];
arr[0]=1;
arr[1]=2;
Hoặc thậm chí tốt hơn
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);
//conditionally get
map.get("n1");
Tên biến động trong Java
Không có điều đó.
Trong trường hợp của bạn, bạn có thể sử dụng mảng:
int[] n = new int[3];
for() {
n[i] = 5;
}
Đối với (name, value)
các cặp tổng quát hơn , hãy sử dụngMap<>
Hãy thử cách này:
HashMap<String, Integer> hashMap = new HashMap();
for (int i=1; i<=3; i++) {
hashMap.put("n" + i, 5);
}