仅根据字段名称对类数组进行排序

2024-03-18

我有一个应用程序,用户向我提供字段名称,例如name or costInCents,我必须按该字段排序。我有办法保证字段名称是正确的。这个应用程序导致了我根本无法上课的复杂情况Comparable并实施具体的compareTo(),因为自定义实现compareTo()我需要知道在实现时使用哪些字段/方法。

因此,为了实现这个目标,我尝试使用反射来将字段与其访问器相匹配。这是我想做的 MWE。

Class Product是一个简单的 POJO 类,我想对其实例进行成对比较:

public class Product
{

    final String name;
    final Integer quantity;
    final Long costInCents;

    public Product(final String name, final Integer quantity, final Long costInCents)
    {
        this.name = name;
        this.quantity = quantity;
        this.costInCents = costInCents;
    }

    public String getName()
    {
        return name;
    }
    public Integer getQuantity()
    {
        return quantity;
    }
    public Long getCostInCents()
    {
        return costInCents;
    }
}

And my Main类,目前不完整:

public class Main {

    public static void main(String[] args) {
        final Product[] productArray =
                {
                    new Product("Clorox wipes", 50, 700L),
                    new Product("Desk chair", 10, 12000L),
                    new Product("TV", 5, 30000L),
                    new Product("Bookcase", 5, 12000L),
                    new Product("Water bottle", 20, 700L),
                };

        // The following void methods are supposed to sort in-place with something like Arrays.sort() or Collections.sort(),
        // but I am also open to solutions involving stuff like Stream::sorted() or similar ones, which return a sorted array.
        sortByField(productArray, "costInCents");
        sortByField(productArray, "name");
    }

    private void sortByField(final Product[] productArray, final String sorterFieldName)
    {
        final Field sorterField = getSorterField(sorterFieldName, LiteProduct.class); // Gets the Field somehow
        final Method sorterAccessor = getSorterAccessor(sorterField, LiteProduct.class);    // Given the Field, this is easy
        Arrays.sort((Product p1, Product p2)->((Comparable<?>)sorterAccessor.invoke(p1)).compareTo(sorterAccessor.invoke(p2)) > 0); // Capture of ? instead of Object
    }
}

不幸的是,Arrays.sort()行会导致编译时错误并显示消息Capture of ? instead of Object。我尝试将第二个参数转换为Comparable<?>, Comparable<? super sorterField.getType()等等,但没有运气。有想法吗?


可能是最好的方法 - 使用排序策略。无需反射,兼容更复杂的排序逻辑:

Map<String, Comparator<Product>> sortingStrategies = new HashMap<>(){
    {
        put("costInCents", Comparator.comparingLong(p->p.costInCents));
        put("quantity", Comparator.comparingLong(p->p.quantity));
        put("name", Comparator.comparing(p->p.name));
    }
};

private void sortByField(final Product[] productArray, final String sorterFieldName)
{
    Arrays.sort(productArray, sortingStrategies.get(sorterFieldName));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅根据字段名称对类数组进行排序 的相关文章

  • Eclipse 与 IntelliJ 热部署

    我的应用程序配置 Tomcat 8 Spring Spring MVC Hibernate 在 Eclipse 中 我创建了 Tomcat 服务器 并将我的应用程序添加到资源中 JSP JS CSS 和 JAVA 类热部署的工作原理就是这样
  • Java:将二维字符串数组打印为右对齐表格

    是什么best打印a的单元格的方法String 数组作为右对齐表 例如 输入 x xxx yyy y zz zz 应该产生输出 x xxx yyy y zz zz 这似乎是一个should能够完成使用java util Formatter
  • 使用 SSL 和代理设置的 Rest 客户端获取连接超时

    我正在使用带有忽略 ssl 的 Rest 客户端 它工作正常 但在将来我尝试使用客户端证书进行的生产中将无法工作 我有 ca 证书和客户端证书 我用它创建了一个客户端 但我收到错误 Exception in thread main com
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • Mockito mockStatic 无法解析符号

    我正在使用 Spring Boot 并在单元测试中 我试图模拟Files delete myFile toPath method 为此 我尝试使用Mockito mockStatic 方法 但是当我尝试使用它时 我的 IDE Intelli
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • Java 套接字 - 读和写

    问题 客户端没有收到任何消息 这是客户端和服务器的完整代码 CLIENT public class Client extends Socket public Client String hostName int port throws Un
  • 如何在 PuTTY 中保存并运行 Java 文件?

    我是 AWS 亚马逊网络服务 的新手 所以这可能是一个基本问题 我在 AWS 上创建了一个 EC2 实例 我有一台 Windows 计算机 因此我使用 PUTTY 来连接 Linux 实例 连接到我的 EC2 实例后 我使用以下命令编写 J
  • 如何组合 3 个或更多 CompletionStages?

    如果有 2 个 CompletionStages 我可以将它们与thenCombine method CompletionStage a aCompletionStage getA CompletionStage b bCompletion
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

    我第一次在大学项目中使用 Hibernate 而且我还是个新手 我想我遵循了我的教授和我阅读的一些教程给出的所有指示 但我不断收到标题中的异常 Exception in thread main org hibernate Hibernate
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • 尝试通过 Java 8 中的 JDBC-ODBC 连接到 .accdb 文件时出现 ClassNotFoundException

    我正在 Eclipse EE IDE 中的 Java 项目中工作 我必须在其中查询 accdb文件 问题是当我尝试加载驱动程序然后连接到数据库时 它给了我一个异常错误 My code try String filePath myfilepa
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • 可空日期列合并问题

    我在 Geronimo 应用程序服务器上使用 JPA 和下面的 openjpa 实现 我也在使用MySQL数据库 我在更新具有可为空 Date 属性的对象时遇到问题 当我尝试合并 Date 属性设置为 null 的实体时 不会生成 sql
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED

随机推荐

  • 如何向 Jackson 全局添加自定义序列化器并默认使用

    假设我想序列化Boolean into Number 默认情况下 我知道我可以逐个领域地做到 JsonFormat shape Shape NUMBER private Boolean success 但是我可以 注册 我的自定义序列化器
  • 如何使用 WinRT 获取文件?

    我想要的是 从 AppData 获取要使用的 xml 我编码的内容 StorageFolder localFolder Windows Storage ApplicationData Current LocalFolder StorageF
  • 使用 R 在一张图中绘制光谱数据

    我有多个数据框 其中第一列 最后填充 NA 是波数 其他列是多次观测的特定波数的变量 是否有可能以我的第一列保存 x 轴变量而另一列绘制为具有各自 y 值的大图的方式绘制列 我已经尝试过 matplot 结果是 数字 而不是点 matplo
  • Microsoft Graph 和 Azure Ad 用户身份验证

    我在 Azure 广告中注册了一个应用程序 当我使用以下详细信息执行 ADAL 时 我会获得一个授权令牌以与 microsoft graph api 一起使用 username email protected cdn cgi l email
  • 如何在 Laravel 5.2 中以 JSON 格式返回 403 响应?

    我正在尝试使用 Laravel 5 2 开发 RESTful API 我偶然发现如何以 JSON 格式返回失败的授权 目前 它抛出 403 页面错误而不是 JSON 控制器 TenantController php class Tenant
  • 与 fork() 共享堆内存

    我正在努力用 C 语言实现一个数据库服务器 它将处理来自多个客户端的请求 我在用fork 处理单个客户端的连接 服务器将数据存储在堆中 堆由指向动态分配记录的哈希表的根指针组成 记录是具有指向各种数据类型的指针的结构 我希望进程能够共享这些
  • 使用 Pyside + Python 中的类进行样式设计

    如何使用类更好地设计该应用程序的样式 而不是为每个看起来相同的标签重新定义相同的样式 更改样式变得很痛苦 因为我必须仔细检查每个看起来相同的标签并粘贴代码以进行匹配 usr bin python coding utf 8 import sy
  • Cordova CLI,使用 Git,并保存插件/平台

    我正在尝试找出如何将一些 Cordova git 最佳实践 与我认为的现实相协调 我希望有人能为我阐明这一点 如果我理解正确的话 当前的 最佳实践 是将这些目录添加到我的 gitignore 来自 使用 Cordova CLI 进行开发 一
  • 有人可以解释一下 xml:base 属性在 XHTML5 中的用途吗?

    我想知道 xml base 属性的作用是什么以及它在 XHTML5 中的值是什么 xml base 属性有什么限制吗 文档为xml base可以被找寻到here http www w3 org TR xmlbase syntax 它允许重新
  • 在 Java 中将列表迭代器传递给多个线程

    我有一个包含大约 200K 元素的列表 我是否能够将此列表的迭代器传递给多个线程 并让它们迭代整个列表 而没有任何一个线程访问相同的元素 这就是我此刻的想法 Main public static void main String args
  • Statsmodels Poisson glm 与 R 不同

    我正在尝试根据 R 中提供的一些代码来拟合一些模型 空间交互模型 我已经能够在 python 框架中使用 statsmodels 使一些代码正常工作 但其中一些代码根本不匹配 我相信我的 R 和 Python 代码应该给出相同的结果 有人看
  • 非模板化成员函数的enable_if用法[重复]

    这个问题在这里已经有答案了 C 程序设计语言 第四版 一书 第28 4章 第796页 解释了enable if并给出了使operator gt 成为条件定义的示例 书中的例子只是一个代码片段 我将其完成为程序如下 include
  • lua __pairs 的实际实现是什么?

    有谁知道 lua 5 2 的实际实现吗 元方法 pairs 换句话说 我如何实施 pairs作为元表中的元方法 因此它的工作原理与pairs 我需要覆盖 pairs并想跳过我在表中添加的一些虚拟变量 下面将使用元表元来显式提供pairs默认
  • 更改数组适配器中列表项的文本颜色

    我创建一个列表视图并在自定义对话框中实现该列表视图 该列表视图使用数组适配器 在我的数组适配器中 我使用自己的布局和所需的颜色 代码如下 listView new ListView context ArrayAdapter
  • PHP Printf 作为浮点精度

    我正在尝试使用 PHPprintf功能打印出用户的存储容量 完整的公式看起来像这样 echo printf 02f size 1024 1024 GB 鉴于 size 10 1024 1024 这应该打印出来 10 00 GB 但事实并非如
  • 读取 byte[] 历史队列

    我正在尝试编写一个我知道数组大小的字节数组 但是我无法解析结果数据 我正在使用以下代码 okAppender writeBytes b gt b write byteData and byte byteData new byte 500 o
  • 如何在phpmyadmin中导入大型sql文件

    我想导入一个大约 12 mb 的 sql 文件 但它在加载时引起问题 有没有办法在不分割sql文件的情况下上传它 尝试根据您的操作系统的口味从 mysql 控制台导入它 mysql u DB USER NAME p DB NAME lt d
  • Spring Boot:禁用特定 URL 的客户端身份验证

    我的配置中有以下配置application yml server address port 8443 sessionTimeout 30 ssl client auth need key store keyStore jks key sto
  • Xamarin iOS 通用链接支持 Twitter 身份验证

    所以 现在 Twitter 从 9 月 25 日开始支持通用链接 这意味着当 UIWebView 命中时https twitter com oauth authorize oauth token https twitter com oaut
  • 仅根据字段名称对类数组进行排序

    我有一个应用程序 用户向我提供字段名称 例如name or costInCents 我必须按该字段排序 我有办法保证字段名称是正确的 这个应用程序导致了我根本无法上课的复杂情况Comparable并实施具体的compareTo 因为自定义实