java 自定义对象 排序,使用自定义排序顺序对对象的ArrayList进行排序

问题

我希望为我的地址簿应用程序实现一个排序功能。

我想排序anArrayList contactArray.Contact是一个包含四个字段的类:名称,家庭电话号码,手机号码和地址。我想排序name。

如何编写自定义排序功能来执行此操作?

#1 热门回答(255 赞)

这是一个关于订购对象的教程:

Java教程 - 集合 - 对象排序

虽然我会给出一些例子,但我仍然建议你阅读它。

有多种方法可以对ArrayList进行排序。如果你想定义a自然(默认)订购,那么你需要letContactimplementComparable。假设你想在name上默认排序,那么为了简单起见省略了nullchecks:

public class Contact implements Comparable {

private String name;

private String phone;

private Address address;

public int compareTo(Contact other) {

return name.compareTo(other.name);

}

// Add/generate getters/setters and other boilerplate.

}

这样你就可以做到

List contacts = new ArrayList();

// Fill it.

Collections.sort(contacts);

如果要定义a外部可控订购(它会覆盖自然顺序),则需要创建aComparator:

List contacts = new ArrayList();

// Fill it.

// Now sort by address instead of name (default).

Collections.sort(contacts, new Comparator() {

public int compare(Contact one, Contact other) {

return one.getAddress().compareTo(other.getAddress());

}

});

你甚至可以在Contact中定义Comparators,以便你可以重复使用它们而不是每次都重新创建它们:

public class Contact {

private String name;

private String phone;

private Address address;

// ...

public static Comparator COMPARE_BY_PHONE = new Comparator() {

public int compare(Contact one, Contact other) {

return one.phone.compareTo(other.phone);

}

};

public static Comparator COMPARE_BY_ADDRESS = new Comparator() {

public int compare(Contact one, Contact other) {

return one.address.compareTo(other.address);

}

};

}

可以使用如下:

List contacts = new ArrayList();

// Fill it.

// Sort by address.

Collections.sort(contacts, Contact.COMPARE_BY_ADDRESS);

// Sort later by phone.

Collections.sort(contacts, Contact.COMPARE_BY_PHONE);

为了使顶部关闭,你可以考虑使用a通用javabean比较器:

public class BeanComparator implements Comparator {

private String getter;

public BeanComparator(String field) {

this.getter = "get" + field.substring(0, 1).toUpperCase() + field.substring(1);

}

public int compare(Object o1, Object o2) {

try {

if (o1 != null && o2 != null) {

o1 = o1.getClass().getMethod(getter, new Class[0]).invoke(o1, new Object[0]);

o2 = o2.getClass().getMethod(getter, new Class[0]).invoke(o2, new Object[0]);

}

} catch (Exception e) {

// If this exception occurs, then it is usually a fault of the developer.

throw new RuntimeException("Cannot compare " + o1 + " with " + o2 + " on " + getter, e);

}

return (o1 == null) ? -1 : ((o2 == null) ? 1 : ((Comparable) o1).compareTo(o2));

}

}

你可以使用如下:

// Sort on "phone" field of the Contact bean.

Collections.sort(contacts, new BeanComparator("phone"));

(正如你在代码中看到的那样,可能已覆盖空字段以避免排序期间的NPE)

#2 热门回答(20 赞)

除了已发布的内容之外,你应该知道,自Java 8起,我们可以缩短代码并将其编写为:

Collection.sort(yourList, Comparator.comparing(YourClass::getFieldToSortOn));

或者因为List现在有sort方法

yourList.sort(Comparator.comparing(YourClass::getFieldToSortOn));

###说明:

从Java 8开始,功能接口(只有一个抽象方法的接口 - 它们可以有更多的默认或静态方法)可以使用以下方法轻松实现:

lambdas参数 - > body

或方法引用source :: method。

由于Comparator只有一个抽象方法int compare(T o1, T o2)是功能界面。

Collections.sort(contacts, new Comparator() {

public int compare(Contact one, Contact other) {

return one.getAddress().compareTo(other.getAddress());

}

});

我们可以将此代码减少为:

Collections.sort(contacts, (Contact one, Contact other) -> {

return one.getAddress().compareTo(other.getAddress());

});

我们可以通过跳过来简化这个(或任何)lambda

参数类型(Java将根据方法签名推断它们)

而不是

(Contact one, Contact other) -> {

return one.getAddress().compareTo(other.getAddress();

}

我们可以写

(one, other) -> one.getAddress().compareTo(other.getAddress())

另外现在Comparator有静态方法,如comparing(FunctionToComparableValue)或667331971,我们可以使用它来轻松创建比较器,它们应该比较对象的某些特定值。

换句话说,我们可以将上面的代码重写为

Collections.sort(contacts, Comparator.comparing(Contact::getAddress));

//assuming that Address implements Comparable (provides default order).

#3 热门回答(8 赞)

This page会告诉你有关排序集合的所有信息,例如ArrayList。

基本上你需要

通过在其中创建方法public int compareTo(Contact anotherContact),使你的Contact类实现Comparable接口。

执行此操作后,你可以调用Collections.sort(myContactList);,其中myContactList是ArrayList (或任何其他Contact集合)。

还有另一种方法,包括创建一个Comparator类,你也可以从链接页面中读到它。

例:

public class Contact implements Comparable {

....

//return -1 for less than, 0 for equals, and 1 for more than

public compareTo(Contact anotherContact) {

int result = 0;

result = getName().compareTo(anotherContact.getName());

if (result != 0)

{

return result;

}

result = getNunmber().compareTo(anotherContact.getNumber());

if (result != 0)

{

return result;

}

...

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUnit和Mockito合作

这次,我想对测试框架Mockito进行概述。 毫无疑问,这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。 用Mockito准备测试 通常&a…

发现2017年最好的CSS框架

如今,无数的框架出现在定期而少数人喜欢自助,Foundation和angular.js主宰了整个世界的发展。CSS代表用于描述HTML(或XML)文档表示的样式表语言。一个框架被定义为一个包,它由一组结构化的文件和标准化代码(…

[python基础] python 2与python 3之间的区别 —— 默认中文字符串长

在python 2.7中使用len获得中文字符串长度时&#xff1a; >>> len(中文) 4 >>> a你好 >>> a \xc4\xe3\xba\xc3 >>> len(a.encode(utf-8))Traceback (most recent call last):File "<pyshell#77>", line 1, in <module&…

stixel world论文总结

1.The Stixel World - A Compact Medium Level Representation of the 3D-World:http://pdfs.semanticscholar.org/2df3/4dbfb4feeb2d7f40e90956ebc8de1f41a5e4.pdf stixel world开山鼻祖文章 https://zhuanlan.zhihu.com/p/27494151 对stixel world相关的一些概念进行解释 2.T…

php如何与数据库连接,PHP文章如何和数据库连接(1)

PHP文章如何和数据库连接(1)(1)Warning: mysql_query() [function.mysql-query]: Access denied for userODBClocalhost (using password: NO) in C:\Program Files\ApacheSoftware Foundation\Apache2.2\htdocs\TM\conn\conn.php on line 32Warning: mysql_query() [function.…

html基本标签与属性

HTML 超文本标记语言 html5 建立一个HTML文件&#xff1a; 文件名 . 后缀(html) 解析&#xff1a;就是去识别 注释&#xff1a;就是给开发人员开的批注------浏览器不去解析&#xff08;不去输出&#xff09; HTML的整体框架 <!DOCTYPE html> <html> <head> …

go基础编程 day-2

Go的常亮 关键字&#xff1a; Const Go常亮的多个定义&#xff1a; // 定义常亮的关键字 const// 定义多个常亮 const(PI 3.14const1 "1"const2 2const3 3 ) 全局变量的声明与赋值&#xff1a; var (name "wyc"name1 1name2 2name3 3 ) 一般类型…

EclipseLink JPA-RS简介

在之前的系列文章中&#xff0c;我介绍了如何创建一个将JPA用于持久层的JAX-RS服务。 EclipseLink包含一个名为JPA-RS的组件&#xff0c;该组件可用于轻松自动地将持久性单元公开为RESTful服务&#xff08;支持XML和JSON消息&#xff09;。 MOXy为JPA-RS提供XML和JSON绑定&…

如何对java分装,Angular4 JSONP + JAVA代码

一、在app.module.ts模块中&#xff0c;注入JsonpModule模块import {JsonpModule} from "angular/http";NgModule({imports: [JsonpModule //注入JSonpModule模块]})二、创建服务httpService&#xff0c;并注入jsonp和map(分装好的服务 可以直接调用)import {Injecta…

教你开发jQuery插件(转)

教你开发jQuery插件&#xff08;转&#xff09; 阅读目录 基本方法支持链式调用让插件接收参数面向对象的插件开发关于命名空间关于变量定义及命名压缩的好处工具GitHub Service Hook原文&#xff1a;http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最…

gulp 常用插件汇总

2017-07-26更新&#xff1a;图片压缩插件使用gulp-smushit&#xff0c;gulp-smushit压缩率比较大&#xff0c;gulp-imagemin 图片压缩插件压缩率不明显。 见下图压缩率&#xff1a; 1、gulp安装 参照gulp官网进行安装&#xff1a;http://www.gulpjs.com.cn/docs/getting-start…

Nmap介绍

1.Nmap介绍 Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况。Nmap可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。 1.1 Zenmap Zenmap是Nmap官方提供的图形界面&#xff0c;通常随Nmap的安装包发布…

使用Maven安装本地jar

1.问题与选择 Maven是一种非常通用的工具&#xff0c;其可用的公共存储库首屈一指。 但是&#xff0c;总会有一个不在任何地方托管的工件&#xff0c;或者托管该工件的存储库有依赖的风险&#xff0c;因为当您需要它时&#xff0c;它可能不会启动。 发生这种情况时&#xff0c;…

转:.NET面试题汇总(三)

原文地址&#xff1a;http://www.cnblogs.com/yuan-jun/p/6600692.html 1、简述 private、 protected、 public、 internal 修饰符的访问权限。private : 私有成员, 在类的内部才可以访问。protected : 保护成员&#xff0c;该类内部和继承类中可以访问。public : 公共成员&…

matlab 多文件编程,是否有可能在MATLAB中为每个文件定义多个函数,并从该文件外部访问它们?...

m文件(即主函数 )中的第一个函数在调用m文件时被调用。 主函数不需要与m文件具有相同的名称&#xff0c;但为了清晰起见&#xff0c;它应该是这样 。 当function和文件名称不同时&#xff0c;必须使用文件名称来调用主函数。m文件中的所有后续函数(称为本地函数 (或旧术语中的“…

简单的Gradle Web应用程序

Gradle通过“ war”和“ jetty”插件轻松支持Java Web应用程序。 本教程将向您展示如何快速创建一个简单的Java Servlet Web应用程序。 我们的基本项目结构将是&#xff1a; basic-websrcmainjavacomcodetutrHelloWorldServlet.javawebappWEB-INFweb.xml首先&#xff0c;创建一…

SD/MMC相关寄存器的介绍

1.SD卡内部架构 在熟悉SD/MMC相关寄存器之前&#xff0c;我们先来看看SD卡的内部架构是怎么样的&#xff0c;如下图所示&#xff1a; 2.SD/MMC相关寄存器的介绍 从上图中总结出&#xff1a;SD卡内部有7个寄存器. 一、OCR,CID,CSD和SCR寄存器保存卡的配置信息; 二、RCA寄存器保存…

【模板】OI常用模板(待补充)

//PS&#xff1a;最近修改日期&#xff1a;2017-11-07  20:41:44 首先感觉这种模板类的东西写了还是很有意义的&#xff0c;毕竟时不时的可以拿出来借鉴一下。 现在因为刚开始写这一类的东西&#xff0c;所以说还不是很详细&#xff0c;若有读者感觉可以补充&#xff0c;欢迎…

form中action属性后面?传递参数 获取不到

1 $p_id $_REQUEST[p_id]; 2 3 echo "<h1>您将更新商品编号为<span>$p_id</span>的商品信息 <a hreflistproduct.php>查看所有</a></h1> 4 <form actionupdateproduct.do.php?p_id$p_id methodget> 5 商品名称&#xff…

apche 禁止运行php,学习猿地-apache如何禁止执行php

apache禁止执行php的方法&#xff1a;首先新建一个“.htaccess”文件&#xff1b;然后复制代码内容“Order allow,deny”到“.htaccess”文件中&#xff1b;最后将该文件直接放到网站根目录里即可。apache禁止执行php的方法&#xff1a;第一种禁止上传目录运行php的方法如果你用…