为对象数组赋值
Assign values to Array of Objects
我正在尝试创建一个对象数组。我要为 10 个节点分配 'node_id'。我还为 class 中的其他变量赋值。 'networkInitialization()' 方法中的 for 循环按顺序将值分配给 'node_id',但是当我尝试在 main 方法中打印它时,它 returns 全部为 '9'。
import java.util.*;
public class tman {
static int N = 10;
static int k = 5;
static Node nodes[] = new Node[N];
public static void main(String[] args) {
networkInitialization();
for(int i = 0; i<N; i++){
System.out.println(nodes[i].node_id);
}
}
public static void networkInitialization(){
Random random = new Random();
int next;
double theta;
System.out.println("Initializing the network");
for(int i = 0; i<nodes.length; i++){
nodes[i] = new Node();
HashSet<Integer> used = new HashSet<Integer>();
//Nodeid
nodes[i].node_id = i;
// System.out.println(nodes[i].node_id);
//Generating 'k' random neighbors list
for(int j = 0; j<k; j++){
next = random.nextInt(10);
while (used.contains(next)) { //while we have already used the number
next = random.nextInt(N); //generate a new one because it's already used
}
used.add(next);
// System.out.println(next);
nodes[i].neighbors[j] = next;
}
//Calculating XCo and YCo
theta = 3.14/2-(i-1)*3.14/(N-2);
nodes[i].x_co = Math.cos(theta);
nodes[i].y_co = Math.sin(theta);
nodes[i].theta = theta;
// System.out.println(nodes[0].x_co);
}
}
}
class Node{
static int node_id;
static double x_co;
static double y_co;
static double theta;
static int k = 30;
static int neighbors[] = new int[k];
static Map<Integer, int[]> received_list = new HashMap<Integer, int[]>();
int N;
public static int getNodeId(){
return node_id;
}
public static double getXCo(){
return x_co;
}
public static double getYCo(){
return y_co;
}
public static double getTheta(){
return theta;
}
public static int[] getNeighbors(){
return neighbors;
}
public static Map<Integer, int[]> getReceivedList(){
return received_list;
}
public void setNodeId(int node_id){
this.node_id = node_id;
}
public void setXCo(int x_co){
this.x_co = x_co;
}
public void setYCo(int y_co){
this.y_co = y_co;
}
public void setTheta(double theta){
this.theta = theta;
}
public void setNeighbors(int neighbors[]){
this.neighbors = neighbors;
}
}
这是我在 main 方法中得到的输出。
Initializing the network
9
9
9
9
9
9
9
9
9
9
任何人都可以帮助我吗?
更新:
看来我对static
的理解还不够。删除 networkInitialization()
方法中的所有静态变量工作正常。谢谢。
正如评论中指出的那样,问题在于 Node
定义中 static
的使用。如果一个变量是 static
,这意味着它对于那个 class 的每个实例都是相同的。为了说明这一点,请看下面的代码:
Node a = new Node();
a.node_id = 1;
Node b = new Node();
b.node_id = 2;
如果 node_id
不是静态的,它会像您预期的那样运行:Java 创建一个 Node a
,它有一个设置为 1 的字段 node_id
然后继续创建另一个 Node b
,它有自己的字段 node_id
,自然不同于节点 a 的 node_id
。
但是,如果node_id
是静态的,所有节点共享同一个字段node_id
!这意味着 Node a
将共享 node_id
设置为 1,但 Node b
访问相同的 node_id
并将其设置为 2.
在你的例子中,最后一次调用共享字段node_id
是在i = 9
时,所以共享node_id
的值是9,不管它是哪个Node .
你说你是初学者,所以你可能不会经常使用 static
。但是,static
可能很有用,例如,如果您想知道总共有多少个节点。在这种情况下,您可以有一个 static
字段来跟踪节点数。每次调用另一个节点时,您都会增加该数字。因为它是共享的,所以所有节点都会知道总共有多少个节点。如果您想了解更多有关如何使用 static
的信息,请参阅 Java tutorial.
我正在尝试创建一个对象数组。我要为 10 个节点分配 'node_id'。我还为 class 中的其他变量赋值。 'networkInitialization()' 方法中的 for 循环按顺序将值分配给 'node_id',但是当我尝试在 main 方法中打印它时,它 returns 全部为 '9'。
import java.util.*;
public class tman {
static int N = 10;
static int k = 5;
static Node nodes[] = new Node[N];
public static void main(String[] args) {
networkInitialization();
for(int i = 0; i<N; i++){
System.out.println(nodes[i].node_id);
}
}
public static void networkInitialization(){
Random random = new Random();
int next;
double theta;
System.out.println("Initializing the network");
for(int i = 0; i<nodes.length; i++){
nodes[i] = new Node();
HashSet<Integer> used = new HashSet<Integer>();
//Nodeid
nodes[i].node_id = i;
// System.out.println(nodes[i].node_id);
//Generating 'k' random neighbors list
for(int j = 0; j<k; j++){
next = random.nextInt(10);
while (used.contains(next)) { //while we have already used the number
next = random.nextInt(N); //generate a new one because it's already used
}
used.add(next);
// System.out.println(next);
nodes[i].neighbors[j] = next;
}
//Calculating XCo and YCo
theta = 3.14/2-(i-1)*3.14/(N-2);
nodes[i].x_co = Math.cos(theta);
nodes[i].y_co = Math.sin(theta);
nodes[i].theta = theta;
// System.out.println(nodes[0].x_co);
}
}
}
class Node{
static int node_id;
static double x_co;
static double y_co;
static double theta;
static int k = 30;
static int neighbors[] = new int[k];
static Map<Integer, int[]> received_list = new HashMap<Integer, int[]>();
int N;
public static int getNodeId(){
return node_id;
}
public static double getXCo(){
return x_co;
}
public static double getYCo(){
return y_co;
}
public static double getTheta(){
return theta;
}
public static int[] getNeighbors(){
return neighbors;
}
public static Map<Integer, int[]> getReceivedList(){
return received_list;
}
public void setNodeId(int node_id){
this.node_id = node_id;
}
public void setXCo(int x_co){
this.x_co = x_co;
}
public void setYCo(int y_co){
this.y_co = y_co;
}
public void setTheta(double theta){
this.theta = theta;
}
public void setNeighbors(int neighbors[]){
this.neighbors = neighbors;
}
}
这是我在 main 方法中得到的输出。
Initializing the network
9
9
9
9
9
9
9
9
9
9
任何人都可以帮助我吗?
更新:
看来我对static
的理解还不够。删除 networkInitialization()
方法中的所有静态变量工作正常。谢谢。
正如评论中指出的那样,问题在于 Node
定义中 static
的使用。如果一个变量是 static
,这意味着它对于那个 class 的每个实例都是相同的。为了说明这一点,请看下面的代码:
Node a = new Node();
a.node_id = 1;
Node b = new Node();
b.node_id = 2;
如果 node_id
不是静态的,它会像您预期的那样运行:Java 创建一个 Node a
,它有一个设置为 1 的字段 node_id
然后继续创建另一个 Node b
,它有自己的字段 node_id
,自然不同于节点 a 的 node_id
。
但是,如果node_id
是静态的,所有节点共享同一个字段node_id
!这意味着 Node a
将共享 node_id
设置为 1,但 Node b
访问相同的 node_id
并将其设置为 2.
在你的例子中,最后一次调用共享字段node_id
是在i = 9
时,所以共享node_id
的值是9,不管它是哪个Node .
你说你是初学者,所以你可能不会经常使用 static
。但是,static
可能很有用,例如,如果您想知道总共有多少个节点。在这种情况下,您可以有一个 static
字段来跟踪节点数。每次调用另一个节点时,您都会增加该数字。因为它是共享的,所以所有节点都会知道总共有多少个节点。如果您想了解更多有关如何使用 static
的信息,请参阅 Java tutorial.