【问题标题】:How to Sort a HashTable [duplicate]如何对哈希表进行排序 [重复]
【发布时间】:2014-12-16 10:10:20
【问题描述】:

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

【问题讨论】:

  • 要恢复插入顺序还是键顺序?
  • 您对在 JSP 中使用 Scriplets 是认真的吗?永远不要使用它们。我看到 Vector 的用法了吗?这是 2014 年,对吗?
  • 如果你想保留订单使用'LinkedHashMap'
  • 您在寻找LinkedHashMap 吗?
  • 对不起,我可以知道如何在我的情况下使用linkedhashmap吗?

标签: java jsp hashtable


【解决方案1】:

哈希表中的键没有按定义排序。顺序取决于密钥的 hashCode()

如果您想对您的密钥进行排序,请使用LinkedHashMap,以保证将按照添加密钥的顺序检索密钥,或者使用TreeMap 与适当的Comparator,以保证根据比较器检索密钥执行。

由于您使用包含的数字字符串作为键,因此您必须实现如下比较器:

public class NumericStringComparator() {
    public int compare(String s1, String s2) {
        return Integer.parseInt(s1) - Integer.parseInt(s2);
    }
}

请注意,我的版本不是null 安全的。欢迎您改进它。

【讨论】:

    【解决方案2】:

    您需要一个列表而不是哈希表来获得正确的有序列表。

    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 
    

    【讨论】:

    • list.add(vFruit); //
    • 不..确实我需要存储在哈希表中。
    【解决方案3】:

    阅读Documentation,您会明白 HASHTABLE 没有排序,但TreeMap 提供了类似here 的比较机制

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 曾尝试在我的答案中复制链接的相关部分,但被另一个人否决了...
    • 这不会使当前的答案更好。
    • 所有链接都指向 Oracle 文档(它们将存在很长时间)或 StackOverFlow 问题。另外,我没有详细回答,因为根本不应该问这个问题,因为最小的谷歌搜索直接链接到 cmets 中提出的duplicate
    【解决方案4】:

    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);
                    }
                });
    

    【讨论】:

      【解决方案5】:

      这行得通。我使用 Eclispe 进行了一些更改。问题可能是哈希表的大小,这可能意味着变量在内存中没有字节对齐。然后键值对将以非顺序​​存储在内存中。

      // 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 [苹果、香蕉]
      htItem===1 [苹果、香蕉]
      htItem===2 [苹果、香蕉]
      htItem===3 [苹果、香蕉]
      htItem===4 [苹果、香蕉]
      htItem===5 [苹果、香蕉]
      htItem===6 [苹果、香蕉]
      htItem===7 [苹果、香蕉]
      htItem===8 [苹果、香蕉]
      htItem===9 [苹果、香蕉]
      htItem===10 [苹果、香蕉]

      不带键“0”的输出:

      htItem===0 null
      htItem===1 [苹果、香蕉]
      htItem===2 [苹果、香蕉]
      htItem===3 [苹果、香蕉]
      htItem===4 [苹果、香蕉]
      htItem===5 [苹果、香蕉]
      htItem===6 [苹果、香蕉]
      htItem===7 [苹果、香蕉]
      htItem===8 [苹果、香蕉]
      htItem===9 [苹果、香蕉]

      将输出更改循环反转为:

      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 [苹果、香蕉]
      htItem===9 [苹果、香蕉]
      htItem===8 [苹果、香蕉]
      htItem===7 [苹果、香蕉]
      htItem===6 [苹果、香蕉]
      htItem===5 [苹果、香蕉]
      htItem===4 [苹果、香蕉]
      htItem===3 [苹果、香蕉]
      htItem===2 [苹果、香蕉]
      htItem===1 [苹果、香蕉]

      编辑后重新格式化输出:

      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=[[苹果, 香蕉]], 9=[[苹果, 香蕉]], 8=[[苹果, 香蕉]], 7=[[苹果, 香蕉]], 6= [[苹果,香蕉]],5=[[苹果,香蕉]],4=[[苹果,香蕉]],3=[[苹果,香蕉]],2=[[苹果,香蕉]],1= [[苹果,香蕉]]}

      【讨论】:

      • 我需要在 1 个 htItem 中显示它 .. 结果 = htItem==={10=[[apple,banana]], 9=[[apple,banana]], 8=[[苹果, 香蕉]], 7=[[苹果, 香蕉]], 6=[[苹果, 香蕉]], 5=[[苹果, 香蕉]], 4=[[苹果, 香蕉]], 3=[[苹果,香蕉]],2=[[苹果,香蕉]],1=[[苹果,香蕉]]}
      猜你喜欢
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2014-01-30
      • 2020-07-04
      • 2011-02-17
      • 2018-11-28
      相关资源
      最近更新 更多