课题

针对单词进行排序,先按字母的长度排序,长者在前;

在长度相等的情况下,按字典降序排序。

例如,有单词序列“apple banana grape orange”,排序后输出结果应为“orange banana grape apple”。

代码

package exp1;

import java.util.List;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.TreeSet;
import java.util.stream.Collector; class word implements Comparable {
public String text;
public int len;
public word() {
// TODO Auto-generated constructor stub
this.text = null;
len = 0;
}
public word(String text) {
this.text = text;
this.len = text.length();
}
public String toString() { //println 打印字符串 先把"输出"转型成字符串:使用valueof 调用了obj.toString之后返回字符串
return text + ":" + len;
}
public int compareTo(Object obj) {
word anothorWord = (word) obj; //父类型转型
if(this.len > anothorWord.len) return -1;
else if(this.len < anothorWord.len) return 1;
int cmpFlag = this.text.compareTo(anothorWord.text);
return -cmpFlag;
} } class myTreeComparator implements Comparator{ //定制排序
//用obj2 和 obj1 比较,obj2是主,和其他obj1比较,
public int compare(Object obj1,Object obj2) {
String s1 = (String) obj1; //父转子类型
String s2 = (String) obj2;
if(s2.length() > s1.length()) return 1;//先比较长度
else if(s2.length() < s1.length()) return -1;
int cmpFlag = s2.compareTo(s1);//按字典序比较字符串
return cmpFlag; //compareTo约定 返回值:负数小于,0相等,正数大于
}
} class myArrayCompartor implements Comparator{ //定制ArrayList的排序规则
public int compare(Object obj1,Object obj2) {
word s1 = (word) obj1;
word s2 = (word) obj2;
if(s2.len > s1.len) return 1;
else if(s2.len < s1.len) return -1;
int cmpFlag = s2.text.compareTo(s1.text);
return cmpFlag;
}
} public class hellotest { public static void main(String args[]) {
TreeSet<word> tre = new TreeSet<word>(); //测试泛型 和下面写法的不同点
// TreeSet tre2 = new TreeSet();//默认按字典序排序
tre.add(new word("grape"));
// tre.add(1213); //出错
/*
* 方法1:使用集合类排序, 实现comparable重写compareTo方法, 或者使用Compartor定制排序器
* 方法2:使用工具类Array排序, 同上
*/
//:自然排序,存储元素的自定义和类实现Comparable接口,重写compareTo方法
TreeSet tre1 = new TreeSet();
// tre1.add(112);
tre1.add(new word("apple"));
tre1.add(new word("orange"));
tre1.add(new word("banana"));
tre1.add(new word("grape"));
System.out.println("Treeset实现comparable接口:");
System.out.println(tre1); //传入compartor接口实现定制排序规则
TreeSet tre2 = new TreeSet(new myTreeComparator()); //传入匿名类 覆写compare方法
tre2.add("apple");
tre2.add("orange");
tre2.add("banana");
tre2.add("grape");
System.out.println("Treeset实现compartor接口:");
System.out.println(tre2); //打印成数组 //使用Lambda表达式定制排序规则
TreeSet tre3 = new TreeSet((obj1,obj2)->{
String s1 = (String) obj1;
String s2 = (String) obj2;
if(s2.length() > s1.length()) return 1;//先比较长度
else if(s2.length() < s1.length()) return -1;
return s2.compareTo(s1);//字符串降序
});
tre3.add("apple");
tre3.add("orange");
tre3.add("banana");
tre3.add("grape");
System.out.println("Treeset使用Lambada表达式实现compartor接口:");
tre3.forEach(obj->System.out.println("tre3: " + obj)); //List集合的sort排序
ArrayList<word> arlArrayList = new ArrayList<word>();
arlArrayList.add(new word("apple"));
arlArrayList.add(new word("orange"));
arlArrayList.add(new word("banana"));
arlArrayList.add(new word("grape"));
//ArrayList 继承重写父接口 List的sort方法,需传入comparator接口参数, 实际上也是调用Arrays工具类的sort
//ArrayList的sort方法,再调用工具类Array的Arrays.sort((E[]) elementData, 0, size, c);
arlArrayList.sort(new myArrayCompartor());
System.out.println("Treeset使用Lambada表达式实现compartor接口:");
System.out.println(arlArrayList); //方法2:使用工具类Arrays的sort方法对数组排序 asList返回一个ArrayList new ArrayList(collection) 接收一个集合 使用底层copy数据
//Arrays.asList返回类型是ArrayList 听说过asList的坑:返回的ArrayList无法再添加新元素 所以这里使用new ArrayList(Arrays.asList) 包装一层就可以再添加新元素啦
List<word> list = new ArrayList<word>(Arrays.asList(new word("apple"),new word("orange"),new word("banana"),new word("grape"))); //asList接收可变长度参数
word[] arr = new word[list.size()];
list.toArray(arr); // return an array containing the elements of this list
Arrays.sort(arr); //使用工具类Arrays的sort方法对数组排序 1.可以传入自定义的Comparator,2.也可以在自定义类里实现Comparable重写compare方法
//底层遗留归并排序 新二分排序
for(int i=0;i<arr.length;i++) System.out.println(arr[i]);
}
}

Java实现单词自定义排序|集合类、工具类排序、comparable、comparator接口的更多相关文章

  1. 在JAVA中自定义连接数据库的工具类

    为什么要自定义数据库连接的工具类: 在开发中,我们在对数据库进行操作时,必须要先获取数据库的连接,在上一篇随笔中提到的获取数据库连接的步骤为: 1.定义好4个参数并赋值 2.加载驱动类 3.获取数据库 ...

  2. java.util.Arrays----操作数组的工具类

    java.util.Arrays操作数组的工具类,里面定义了很多操作数组的方法 1.boolean equals(int[] a,int[] b):判断两个数组是否相等. 2.String toStr ...

  3. Java判断不为空的工具类总结

    1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. package com.bie.util; import java.util.Collection; imp ...

  4. Java字符串转16 进制工具类Hex.java

    Java字符串转16 进制工具类Hex.java 学习了:https://blog.csdn.net/jia635/article/details/56678086 package com.strin ...

  5. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  6. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  7. “全栈2019”Java第七十九章:类中可以嵌套接口吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. Java基础---泛型、集合框架工具类:collections和Arrays

    第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...

  9. Java数组操作利器:Arrays工具类

    java.util.Arrays提供大量的工具方法来操作数组,这些方法全是静态方法. 1 便捷创建List public static <T> List<T> asList(T ...

随机推荐

  1. TP5 查询mysql数据库时的find_in_set用法

    $where['class_id'] = ['in', '$cid_all']; $where['id'] = ['in', $all_user_id];//或这样子 $where['title'] ...

  2. Jedis Unexpected end of stream & java.net.SocketException: Broken pipe问题解决思路

    笔者一直维护的稳定基础服务测试环境不稳定了,这能忍!盘他,虽然不一定能完全盘的了. 背景: hrexternal 基础服务对外提供公司员工获取的多个接口,很多接口访问频率比较高,加了缓存,使用的是re ...

  3. bootrom/spl/uboot/linux逐级加载是如何实现的?

    关键词:bootrom.spl.uboot.linux.mksheader.sb_header.mkimage.image_header_t等等. 首先看一个典型的bootrom->spl-&g ...

  4. June 09th, 2019. Week 24th, Sunday

    The beauty you see in me is a reflection of you. 你在我身上看到的美,正是你的倒影. From Jalaluddin Rumi. What we see ...

  5. eNSP仿真模拟软件之理解Hybrid接口的应用

    1. 实验原理 Hybrid接口既可以连接普通终端的接入链路又可以连接交换机间的干道链路,它允许多个VLAN的帧通过,并可以在出接口方向将某些VLAN帧的标签剥掉. Hybrid接口处理VLAN帧的过 ...

  6. 对java的几点个人浅浅的认知

    特点   简单地说,Java 具有如下特点:简单的.面向对象.平台无关.多线程.分布式.安全. 高性能.可靠的.解释型.自动垃圾回收等特点. 主要面向internet的语言 Java比其他任何一门语言 ...

  7. 几款常见web扫描器的简要记录

    一.前期侦查 为了减少和目标系统的交互(防止触发报警),建议将目标站点镜像一份到本地 httrack(镜像网站到本地)  ====> 根据引导填入相关信息即可,使用非常简单 二.扫描 扫描分两种 ...

  8. 3. java 方法入门

    一.方法定义 1. 定义格式 public static void 方法名称(){ 方法体 } 1. 方法名称:命名和变量一致,小驼峰式 2. 方法体:大括号中可以包含任意条语句 注意事项: 1. 方 ...

  9. 踩坑---vue-cli搭建的项目中localhost不能访问

    只需要在config文件夹里面的index.js文件里面的module.exports下面的dev中的 host:'localhost' 改为 host:'0.0.0.0' ,然后重启服务器

  10. IT兄弟连 HTML5教程 HTML5行业的发展预测

    现在的互联网市场上,HTML5在快速地成长,甚至是未来几年里将会有很多公司进入HTML5这个领域,HTML5也会像传统的Flex,Flash,Silverlight和Objective-C那样,更容易 ...