根据值对地图进行排序时,某些值会丢失。是什么导致了这种奇怪的行为?

2024-06-25

我正在尝试根据词频(即基于值)对地图进行排序。为此,我已经重写了比较器并传递给TreeMap,但我得到了这个奇怪的输出。

public class WordFrequency {
    public static String sentence = "one three two two three three four four four";
    public static Map<String, Integer> map;

    public static void main(String[] args) {
        map = new HashMap<>();
        String[] words = sentence.split("\\s");

        for (String word : words) {
            Integer count = map.get(word);
            if (count == null) {
                count = 1;
            } else {
                ++count;
            }
            map.put(word, count);
        }

        Comparator<String> myComparator = new Comparator<String>() {

            @Override
            public int compare(String s1, String s2) {
                if (map.get(s1) < map.get(s2)) {
                    return -1;
                } else if (map.get(s1) > map.get(s2)) {
                    return 1;
                } else {
                    return 0;
                }
            }

        };
        SortedMap<String, Integer> sortedMap = new TreeMap<String, Integer>(myComparator);
        System.out.println("Before sorting: " + map);
        sortedMap.putAll(map);
        System.out.println("After Sorting based on value:" + sortedMap);

    }
}

Output:

Before sorting: {two=2, one=1, three=3, four=3}
After sorting based on value:{one=1, two=2, three=3}

预期输出:

{one=1, two=2, four=3,three=3}

Your compare方法无法遵守 Map 接口的约定,因为它比较的是值而不是键。您的实现会导致具有相同值的两个键被视为相同的键。因此你的sortedMap不包含“四”键,该键与“三”键具有相同的值。

注意由树图维护的顺序,就像任何排序的映射一样,无论是否提供显式比较器,如果这个排序的map要正确实现Map接口就必须和equals一致。 (有关与 equals 一致的精确定义,请参阅 Comparable 或 Comparator。)之所以如此,是因为 Map 接口是根据 equals 操作定义的,但排序映射使用其compareTo(或compare)方法执行所有键比较, so 从排序映射的角度来看,此方法认为相等的两个键是相等的。即使排序与 equals 不一致,排序映射的行为也是明确定义的;它只是没有遵守 Map 接口的一般契约。

树形图参考 http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

您可以通过在值相等时比较键来解决此问题:

    Comparator<String> myComparator = new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            if (map.get(s1) < map.get(s2)) {
                return -1;
            } else if (map.get(s1) > map.get(s2)) {
                return 1;
            } else {
                return s1.compareTo(s2);
            }
        }

    };

这应该给你一个输出:

After sorting based on value:{one=1, two=2, four=3, three=3}

Since four<three基于字符串的自然排序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据值对地图进行排序时,某些值会丢失。是什么导致了这种奇怪的行为? 的相关文章

  • 为 HTTPS 连接设置 https.protocols 系统属性时出现问题

    我有一个 Java 实现 各种客户端应用程序使用它来连接到第三方系统 这些第三方系统支持 http https 上的不同协议 在这种情况下 所有客户端应用程序都托管在我的 Java 实现托管的同一服务器中 因此 在这种情况下 各种客户端应用
  • 从 ArrayList Java 中的 HashMap 键中检索所有值

    美好的一天 这让我现在有点困惑 大脑冻结 并且似乎遗漏了一些东西 有一个 ArrayList 我用 HashMap 填充它 现在我放入 HashMap 和 arraylist Map put DATE value1 Map put VALU
  • Spring批处理2.2 JavaConfig

    我正在尝试让 Spring Batch 2 2 与 JavaConfig 一起使用 如今他们有一个 EnableBatchProcessing设置很多东西的注释 默认情况下 该注释使用数据源作为其作业数据 但我们不想保存此数据 也不想为其创
  • 单击按钮时更改照片

    import javax swing Icon import javax swing ImageIcon public class Stage1 extends javax swing JFrame int score 0 int iter
  • 问题:将大数据传递给第二个 Activity

    我有一个奇怪的问题 我在网上浏览但没有找到答案 我仍然是android编程的初学者 那么让我们开始吧 我想做的就是用一些数据调用第二个活动 它适用于小数据 但如果数据变大 第二个 Activity 将不会显示 第一个 Activity 将完
  • java中简单程序中的“未为类型定义方法”错误

    所以我只是想学习 Java 在观看了一些教程并阅读了一些基本内容之后 我对为什么它无法运行感到困惑 package Test public class TestProg public static void main String args
  • 使用 Hibernate/Spring 生成数据库更新脚本

    我有一个项目 我们过去依赖 hibernate 来更新数据库 hibernate hbm2ddl auto update 即使在产品上 我正在将其迁移为使用 liquibase 我唯一担心的是 并不是我的团队中的每个人都是 sql 专家 因
  • Selenium 和 xpath:查找带有类/id 的 div 并验证其中的文本

    我正在努力拥有xpath find a div并验证div有一个特定的string里面的文字 这是HTML div class Caption Model saved div and div class gwt HTML sfnStanda
  • 面临 process.start(); 的问题在 Android 棒棒糖中

    面临一个问题process start 在 Android 棒棒糖中 我在服务中遇到了 android lollipop 后台进程的问题 我的代码在 KitKat 之前工作正常 我有一个ProcessBuilder pBuilder并向其中
  • 识别包含本机方法实现的库文件/源

    如何识别包含本机方法实现的库文件 Ex public native String intern 我在哪里可以找到实施 source code of String intern 方法 找到了答案String intern 与快速谷歌搜索 ht
  • 如何在Java中验证字符串是否是有效的URL(包括深层链接)[重复]

    这个问题在这里已经有答案了 如何在 Java 中验证字符串是否是有效的 URL 包括深层链接 对于以下测试用例 该方法应返回 true http www example com gizmos https www example com gi
  • Finalize() 何时执行? [复制]

    这个问题在这里已经有答案了 在一次采访中我被问到 假设 JVM 在 A 类对象未被使用时运行 gc class A some code here protected void finalize code here 它是否保证finalize
  • Java Reflection:为什么这么慢?

    我一直避免使用 Java 反射 因为它速度缓慢 我在当前项目的设计中达到了一个点 能够使用它将使我的代码更具可读性和优雅性 所以我决定尝试一下 我只是对这种差异感到惊讶 我注意到有时运行时间几乎延长了 100 倍 即使在这个简单的例子中 它
  • 菜单项标题未显示

    菜单项的标题未显示在片段内 我在菜单文件中有两个项目 第一个是带有图标和标签的showAsAction always在工具栏中显示图标 第二个只有标题 我不知道这里出了什么问题 菜单项的所有操作均有效 例如下面 菜单 销售 xml menu
  • 将 Tango 3D 点投影到屏幕 Google Project Tango

    Project Tango 提供了点云 如何获取点云中 3D 点的像素位置 以米为单位 我尝试使用投影矩阵 但得到的值非常小 0 5 1 3 等 而不是 1234 324 以像素为单位 我包含我尝试过的代码 Get the current
  • Scala 不可变 Map 速度慢

    当我创建地图时 我有一段代码 val map gtfLineArr 8 split map split collect case Array k v gt k v toMap 然后我使用这张地图来创建我的对象 case class MyOb
  • 在 Ubuntu 上的 Tomcat 中加载共享本机库

    如何在 Ubuntu 上的 Tomcat6 中加载共享库 我创建了一个名为 libawragrids so 的库 awragrids 并将其放置在 var lib tomcat6 shared 我在调用启动 tomcat 的终端中设置了以下
  • Java:当计时器处于活动状态时,JSplitPane 将顶部面板的内容复制到底部面板

    所以我有一个 JSplitPane 和两个 JPanel 一个在顶部 一个在底部 在这两个面板中 我重写了paintComponent方法并添加了我自己的图形 在底部面板中 我想添加动画 当面板不重新绘制时 这很好 但是一旦计时器 java
  • 如何处理JFreeChart中的SpiderWebPlot?

    发现 JFreeChart 我在使用时遇到了问题蜘蛛网情节 http www jfree org jfreechart api javadoc org jfree chart plot SpiderWebPlot html 这就是我今天所拥
  • java中的“main”可以返回字符串吗?

    java中的public static void main String args 是否有可能返回String代替void 如果是 怎么办 public static String main String args 代替 public st

随机推荐

  • perl 中的大写重音字符

    有没有办法在perl中大写重音字符 my string l phant print uc string 这样它实际上会打印 L PHANT 我的 perl 脚本以 ISO 8859 1 编码 string 以相同编码打印在 xml 文件中
  • 如何在 python 2.7 中使用 re.UNICODE?

    我正在尝试使用 re UNICODE 标志来匹配可能包含 unicode 字符的字符串 但它似乎不起作用 例如 Python 2 7 12 default Dec 4 2017 14 50 18 GCC 5 4 0 20160609 on
  • SignalR 的 Android 客户端不接收,但 JS 接收

    这是一个 hello world 应用程序 但我找不到解决方案 这是客户端上的代码 public class MainActivity extends ActionBarActivity HubProxy proxy EditText me
  • 处理异步时 TcpClient 与 Socket

    这不是另一个 TcpClient 与 Socket 的较量 TcpClient 是 Socket 类的包装器 以简化开发 同时还公开了底层 Socket 仍然 在 TcpClient 类的 MSDN 库页面上 可以读到以下注释 TcpCli
  • 从总和为所需总数的值列表中确定所有可能的组合

    一位朋友问我一个编程问题 关于如何确定一组值中所有可能的值组合可以相加以获得所需的总数 我有一个解决方案 但它不太优雅 它基本上只是一系列 for 循环和 if 语句 我确信 dplyr 有一个我想不到的解决方案 因为我知道它有多么有用 但
  • Laravel:Eloquent Eager Loading 关系的选择位置

    我有两个数据库表 Posts table gt increments id table gt integer country id gt unsigned table gt foreign country id gt references
  • 当应用程序最小化时隐藏表单

    我有一个主表单和一个状态表单 当我的应用程序中的工作正在进行时 我会显示它们 如果工作完成我就打电话Hide状态表上出现 状态表消失 当我最小化主窗体而等待窗体可见时 就会出现问题 然后两种形式都被隐藏 这就是我想要的 但是 如果工作完成时
  • tomcat cookie域验证

    我正在使用 tomcat 8 0 21 和新的 Rfc6265 cookie 处理器 如果有以点开头的 cookie 我会收到以下错误 java lang IllegalArgumentException An invalid domain
  • 这段代码违反了严格的别名规则?

    I read https www qt io blog 2011 06 10 type punning and strict aliasing https www qt io blog 2011 06 10 type punning and
  • 自定义通知视图

    我想创建一个类似于 Google 应用程序通知的通知图标视图 不同之处在于我需要能够在运行时更改颜色 而 Google 图标为灰色或红色 因此我假设它们正在使用 StateListDrawable 对此最好的方法是什么 我更喜欢有圆角 并且
  • C++字符串解析思路

    我有另一个程序的输出 它更适合人类可读而不是机器可读 但无论如何我都会解析它 没什么太复杂的 然而 我想知道在 C 中执行此操作的最佳方法是什么 这更像是一个 一般实践 类型的问题 我研究了 Boost Spirit 甚至让它发挥了一些作用
  • 如何为所有 IEnumerable 重写 ToString() 方法?

    我想覆盖ToString on IEnumerable
  • 为 Pod 分配的默认内存是多少

    我正在设置一个 pod 说test pod在我的 google kubernetes 引擎上 当我部署 pod 并使用 google 控制台查看工作负载时 我能够看到100m CPU默认情况下分配给我的 Pod 但我无法看到我的 Pod 消
  • PHP 使用 LetsEncrypt 验证失败

    尝试读取流时遇到问题 result file get contents url false stream context create http gt timeout gt float this gt options timeout SSL
  • HashSet 中的 Union 与 Unionwith

    有什么区别HashSet Union vs HashSet Unionwith当我组合 2 个哈希集时 我正在尝试这样组合 HashSet
  • REBOL 布局:如何自动创建布局单词 - 单词没有上下文?

    使用 REBOL View 2 7 8 Core 我想通过自动将单词分配给各种布局项来预先准备视图布局 如下例所示 代替 prepared view across cb1 check label Checkbox 1 cb2 check l
  • 带有嵌套数组的 NSPredicate

    我有以下对象结构 类别 子类别 子类别的 nsarray 子类别 问题 问题的 nsarray 问题 问题 nsstring 答案 ns字符串 我需要的是用给定的子字符串搜索任何问题 以下谓词不起作用 NSPredicate predica
  • Http_Request2 POST 请求不起作用

    各位早上好 我正在使用 Http Request2 lib 进行一些工作 并且面临这种情况 我正在尝试向某个 URL 发出 POST 请求 如果我在 url 的查询字符串上添加参数 即 request gt setUrl 127 0 0 1
  • 使用 mocha 和 chai 测试 fetch

    我有以下示例测试 import assert from chai function starWarsMovies fetch http swapi co api films then res gt return res json then
  • 根据值对地图进行排序时,某些值会丢失。是什么导致了这种奇怪的行为?

    我正在尝试根据词频 即基于值 对地图进行排序 为此 我已经重写了比较器并传递给TreeMap 但我得到了这个奇怪的输出 public class WordFrequency public static String sentence one