如何排序哈希表

时间:2014-12-16 10:10:20

标签: java jsp hashtable

我可以知道为什么我的哈希表号码不合适吗?达到一定数量后。请真的需要专家的帮助。任何帮助将不胜感激。非常感谢!! 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输入新数字时,如何使列表的数量正确。?

5 个答案:

答案 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 = [[苹果,香蕉]]}