Java 向量仅用最后一项填充
目标是用哈希表填充哈希表向量 为此,我迭代光标,将光标找到的内容放入哈希表,然后将哈希表添加到向量中,如下所示:Java 向量仅用最后一项填充,java,android,Java,Android,目标是用哈希表填充哈希表向量 为此,我迭代光标,将光标找到的内容放入哈希表,然后将哈希表添加到向量中,如下所示: Vector<Hashtable<String, String>> v = new Vector<Hashtable<String, String>>(); Hashtable<String,String> h = new Hashtable<String,String>(); while(cursor.mov
Vector<Hashtable<String, String>> v = new Vector<Hashtable<String, String>>();
Hashtable<String,String> h = new Hashtable<String,String>();
while(cursor.moveToNext()) {
h.put("name", cursor.getString(0));
h.put("region", cursor.getString(1));
h.put("_id", cursor.getString(2));
v.addElement(h);
}
Vector v=new Vector();
Hashtable h=新的Hashtable();
while(cursor.moveToNext()){
h、 put(“name”,cursor.getString(0));
h、 put(“region”,cursor.getString(1));
h、 put(“_id”,cursor.getString(2));
v、 增编(h);
}
结果是一个向量,其中填充了游标中的最后一个元素,如果游标在X个元素上迭代,则该向量具有创建的最后一个哈希表的X倍
添加这一行可以解决问题:
Vector<Hashtable<String, String>> v = new Vector<Hashtable<String, String>>();
Hashtable<String,String> h = new Hashtable<String,String>();
while(cursor.moveToNext()) {
h = new Hashtable<String,String>(); // <--THIS LINE HERE
h.put("name", cursor.getString(0));
h.put("region", cursor.getString(1));
h.put("_id", cursor.getString(2));
v.addElement(h);
}
Vector v=new Vector();
Hashtable h=新的Hashtable();
while(cursor.moveToNext()){
h=new Hashtable();//在第一段代码中,您只是覆盖了同一个对象,因此假设您在while循环上迭代了两次,然后在下一次迭代中,由于没有创建新实例,对象的名称、区域和_id字段将被指定给它们的任何值覆盖。因此,您有两个项,它们的属性值都相同。在第一个代码块中,您只是覆盖了同一个对象,所以假设您已迭代在while循环中执行两次。如果第一个h实例具有name=“a”、region=“b”和_id=“c”,然后在下一次迭代中,由于没有创建新实例,对象的名称、区域和_id字段将被指定给它们的任何值覆盖。因此,您有两个项,它们的属性值都相同。在第一个代码示例中,每次迭代都通过而循环填充 与当前光标位置的内容相同的哈希表
。在第二个代码示例中,调用构造函数(新哈希表()
部分)确保每次迭代都填充不同的哈希表
请注意,对于集合,可以以不明显的方式修改它们。假设我们有以下程序:
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("hello");
set.add("world");
Vector<Set<String>> v = new Vector<>();
v.add(set);
set.clear();
System.out.println(v);
}
当add()
将集合
添加到向量
时,不会“锁定”其内容。因此对集合
的进一步更改也会影响向量
类似地,在程序中,在第一次循环迭代后,向量
将使用第一个光标位置的内容保存对哈希表
的单个引用。但是,第二次迭代运行时,将覆盖哈希表
的内容和添加()
s再重复一遍。现在您的向量将包含两个引用(指向相同的哈希表
),每个引用都包含第二个光标位置的内容
此模式将重复,直到while
循环终止,此时向量将有X个引用(指向相同的哈希表
),每个都包含最后一个光标位置的内容。在第一个代码示例中,通过while
循环的每次迭代都使用当前光标位置的内容填充相同的
。在第二个代码示例中,调用构造函数(新Hashtable()
部分)确保每次迭代都填充不同的哈希表
请注意,对于集合,可以以不明显的方式修改它们。假设我们有以下程序:
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("hello");
set.add("world");
Vector<Set<String>> v = new Vector<>();
v.add(set);
set.clear();
System.out.println(v);
}
当add()
将集合
添加到向量
时,不会“锁定”其内容。因此对集合
的进一步更改也会影响向量
类似地,在程序中,在第一次循环迭代后,向量
将使用第一个光标位置的内容保存对哈希表
的单个引用。但是,第二次迭代运行时,将覆盖哈希表
的内容和添加()
s再重复一遍。现在您的向量将包含两个引用(指向相同的哈希表
),每个引用都包含第二个光标位置的内容
此模式将重复,直到while
循环终止,此时向量将有X个引用(指向相同的哈希表
),每个引用都包含最后一个光标位置的内容