我可以知道为什么我的哈希表号码不合适吗?达到一定数量后。请真的需要专家的帮助。任何帮助将不胜感激。非常感谢!! jsp文件中的代码。
<%
Vector vRow2 = new Vector();
Vector vFruit = new Vector();
Hashtable htItem = new Hashtable();
vRow2.addElement("apple");
vRow2.addElement("banana");
vFruit.addElement(vRow2);
htItem.put("1", vFruit);
htItem.put("2", vFruit);
htItem.put("3", vFruit);
htItem.put("4", vFruit);
htItem.put("5", vFruit);
htItem.put("6", vFruit); // if htItem put only up to 6 it show correct order result 6,5,4,3,2,1
htItem.put("7", vFruit); // if htItem put up to 7 it show incorrect order result 6,5,4,3,2,1,7
htItem.put("8", vFruit); // if htItem put up to 8 it show result 6,5,4,3,2,1,8,7
htItem.put("9", vFruit); // if htItem put up to 9 it show correct order 9,8,7,6,5,4,3,2,1
htItem.put("10", vFruit); // if htItem put up to 10 it show incorrect order result 9,8,6,5,4,3,2,10,1
System.err.println("htItem==="+htItem);
%>
htItem==={9=[[apple, banana]], 8=[[apple, banana]], 7=[[apple, banana]], 6=[[apple, banana]], 5=[[apple, banana]], 4=[[apple, banana]], 3=[[apple, banana]], 2=[[apple, banana]], 10=[[apple, banana]], 1=[[apple, banana]]}
预期输出:10,9,8,7,6,5,4,3,2,1
每次htItem输入新数字时,如何使列表的数量正确。?
答案 0 :(得分:2)
阅读Documentation,您将了解HASHTABLE未订购,但TreeMap提供的比较机制如here
答案 1 :(得分:2)
哈希表中的键不按定义排序。订单取决于密钥的 hashCode()。
如果您希望对密钥进行排序,请使用LinkedHashMap
保证密钥的检索顺序与添加密钥相同,或TreeMap
使用适当的Comparator
保证密钥。将根据比较器实现检索。
由于您使用包含的数字字符串作为键,因此您必须实现如下的比较:
public class NumericStringComparator() {
public int compare(String s1, String s2) {
return Integer.parseInt(s1) - Integer.parseInt(s2);
}
}
请注意,我的版本不是null
安全的。欢迎您加以改进。
答案 2 :(得分:1)
您需要一个列表而不是哈希表才能获得正确的有序列表。
List<Vector> list = new ArrayList<Vector>();
list.add(0,vFruit);
list.add(1,vFruit);
list.add(2,vFruit);
list.add(3,vFruit);
list.add(vFruit); //<- index 5
答案 3 :(得分:0)
HashTable不按键排序。您应该使用TreeMap而不是使用HashTable,它将按您输入的密钥进行排序。由于您需要按降序按键对地图进行排序,因此您可以执行以下操作:
Map<String, Vector> map = new TreeMap<String, Vector>(
new Comparator<String>() {
public int compare(String key1, String key2) {
return Integer.parseInt(key2) - Integer.parseInt(key1);
}
});
答案 4 :(得分:0)
这很有效。我使用Eclispe做了一些改变。问题可能是Hashtable的大小,这可能意味着变量在内存中没有字节对齐。然后,键值对将以非顺序的顺序存储在内存中。
// added <String>
Vector<String> vRow2 = new Vector<String>();
Vector<String> vFruit = new Vector<String>();
Hashtable<String, Vector<String>> htItem = new Hashtable<String, Vector<String>>();
vRow2.addElement("apple");
vRow2.addElement("banana");
vFruit.addAll(vRow2); //changed to addAll()
htItem.put("0", vFruit);
//the above line of code makes everything work
//I don't understand why tho
htItem.put("1", vFruit);
htItem.put("2", vFruit);
htItem.put("3", vFruit);
htItem.put("4", vFruit);
htItem.put("5", vFruit);
htItem.put("6", vFruit); // if htItem put only up to 6 it show correct order result 6,5,4,3,2,1
htItem.put("7", vFruit); // if htItem put up to 7 it show incorrect order result 6,5,4,3,2,1,7
htItem.put("8", vFruit); // if htItem put up to 8 it show result 6,5,4,3,2,1,8,7
htItem.put("9", vFruit); // if htItem put up to 9 it show correct order 9,8,7,6,5,4,3,2,1
htItem.put("10", vFruit); // if htItem put up to 10 it show incorrect order result 9,8,6,5,4,3,2,10,1
//loop added to list each key
int i = 0;
for (i=0; i < htItem.size(); i++){
//modified to print results
String res = String.valueOf(i);
System.err.println("htItem==="+res+"\t"+htItem.get(res));
}
Eclipse控制台中的输出:
htItem === 0 [apple,banana]
htItem === 1 [苹果,香蕉]
htItem === 2 [apple,banana]
htItem === 3 [苹果,香蕉]
htItem === 4 [apple,banana]
htItem === 5 [apple,banana]
htItem === 6 [苹果,香蕉]
htItem === 7 [苹果,香蕉]
htItem === 8 [苹果,香蕉]
htItem === 9 [苹果,香蕉]
htItem === 10 [apple,banana]
无键输出&#34; 0&#34;:
htItem === 0 null
htItem === 1 [苹果,香蕉]
htItem === 2 [apple,banana]
htItem === 3 [苹果,香蕉]
htItem === 4 [apple,banana]
htItem === 5 [apple,banana]
htItem === 6 [苹果,香蕉]
htItem === 7 [苹果,香蕉]
htItem === 8 [苹果,香蕉]
htItem === 9 [apple,banana]
将输出更改循环反转为:
int i = htItem.size()-1;
while (i >= 1){
String res = String.valueOf(i);
System.err.println("htItem==="+res+"\t"+htItem.get(res));
i--;
}
Eclipse输出:
htItem === 10 [apple,banana]
htItem === 9 [苹果,香蕉]
htItem === 8 [苹果,香蕉]
htItem === 7 [苹果,香蕉]
htItem === 6 [苹果,香蕉]
htItem === 5 [apple,banana]
htItem === 4 [apple,banana]
htItem === 3 [苹果,香蕉]
htItem === 2 [apple,banana]
htItem === 1 [apple,banana]
编辑重新格式化的输出后:
int i = htItem.size()-1;
System.err.print("htItem==={");
while (i >= 1){
String res = String.valueOf(i);
System.err.print(res+"=["+htItem.get(res)+"], ");
i--;
if (i == 1){
res = String.valueOf(i);
System.err.print(res+"=["+htItem.get(res)+"]");
System.err.println("}");
return;
}
}
Eclipse输出:
htItem === {10 = [[apple,banana]],9 = [[apple,banana]],8 = [[apple,banana]],7 = [[apple,banana]],6 = [[apple,banana]],5 = [[apple,banana]],4 = [[apple,banana]],3 = [[apple,banana]],2 = [[apple,banana]],1 = [[苹果,香蕉]]}