Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序

时间:2021-10-28 07:05:03
package TreeSetTest;

import java.util.Iterator;
import java.util.TreeSet; import javax.management.RuntimeErrorException; /*
可以对set集合中的元素进行排序,其底层的数据结构是二叉树,
保证元素唯一性的依据是compareTo和return 0; TreeSet排序的第一种方式
让元素自身具备比较性
元素需要实现Comparable接口,覆盖compareTo方法
这种方式也成为元素的自然顺序,或者叫做默认顺序 TreeSet排序的第二种方式
当元素自身不具备比较性时,或者具备的比较性不是所需的
这时就需要让集合自身具备比较性
在集合初始化时,就有了比较方式 记住:当比较时,如果主要条件相同,就比较次要条件
*/ class Student implements Comparable // 该接口强制让对象具有比较性
{
private String name;
private int age; Student(String name,int age)
{
this.name = name;
this.age = age;
} public int compareTo(Object obj)
{
/* if (!(obj instanceof Student))
{
throw new RuntimeException("不是学生对象");
}
Student s = (Student)obj;
// System.out.println(this.name+"=====Compare====="+this.age);
if (this.age >s.age)
{
return 1;
}
else if (this.age == s.age) {
// 如果年龄相同比较姓名
return this.name.compareTo(s.name);
}
else {
return -1;
} */
return -1;
} public String getname()
{
return this.name;
} public int getage()
{
return age;
}
} public class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet<Student> tsSet =new TreeSet<Student>(); tsSet.add(new Student("as", 12));
tsSet.add(new Student("fvhgj",45));
tsSet.add(new Student("ert", 15));
tsSet.add(new Student("wenjia", 31));
tsSet.add(new Student("wejia", 1)); Iterator<Student> iterator = tsSet.iterator(); while (iterator.hasNext())
{
Student stu = (Student)iterator.next();
System.out.println(stu.getage()+"======"+stu.getname());
}
}
} ////////////////////////////////////////////
////////////////////////////////////////////
package TreeSetTest; import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; /*
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。 当两种排序都存在时,一比较器为主 定义一个类,实现Comparator接口,覆盖compare方法
二叉树都是以 return 0;判断元素是否相等
*/ public class TreeSetDemoTwo
{
public static void main(String[] args)
{
TreeSet<Student> tsSet = new TreeSet<Student>(new MyCompare()); tsSet.add(new Student("wenjai10", 29));
tsSet.add(new Student("wenjai11", 28));
tsSet.add(new Student("wenjai12", 27));
tsSet.add(new Student("wenjai13", 26));
tsSet.add(new Student("wenjai11", 21)); Iterator<Student> it = tsSet.iterator();
while (it.hasNext())
{
Student student = (Student) it.next();
System.out.println(student.getname()+"======"+student.getage()); }
}
} class MyCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2; int num = s1.getname().compareTo(s2.getname());
if (num == 0)
{
// 由于整数类型也有比较方法,所以将整数封装成对象
return new Integer(s1.getage()).compareTo(new Integer(s2.getage()));
/*
if (s1.getage()>s2.getage())
{
return 1;
}
if (s1.getage() == s2.getage())
{
return 0;
}
return -1;
*/
}
return num;
}
} ///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
package TreeSetTest; import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; /*
练习: 按照字符串长度排序 字符串本身具有比较性,但是它的比较方式不是所需的 这时就只能用比较器
*/ public class TreeSetPractice_One
{ public static void main(String[] args)
{
TreeSet<String> ts = new TreeSet<String>(new stringLenCompare()); ts.add("asd");
ts.add("bb");
ts.add("ba");
ts.add("ityior");
ts.add("hysdhbgg"); Iterator<String> it = ts.iterator();
for (String string : ts)
{
System.out.println(string);
}
}
} class stringLenCompare implements Comparator
{
@Override
public int compare(Object o1, Object o2)
{
// TODO Auto-generated method stub
String str1 = (String)o1;
String str2 = (String)o2; /*
if (str1.length()>str2.length())
{
return 1;
}
if(str1.length() == str2.length())
{
return 0;
}
*/
int num = new Integer(str1.length()).compareTo(new Integer(str2.length()));
if (num == 0)
{
return str1.compareTo(str2);
}
return num;
// return 0;
}
}

  

Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序的更多相关文章

  1. JAVA 类的定义(定义一个类,来模拟&OpenCurlyDoubleQuote;学生”)

    package Code413;/*定义一个类,来模拟“学生”属性 (是什么) 姓名 年龄行为(能做什么) 吃饭 睡觉 学习对应到Java的类当中 成员变量(属性) String nanme; //姓 ...

  2. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  3. 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name&comma;腿的数量legs,统计动物的数量 count&semi;方法:设置动物腿数量的方法 void setLegs&lpar;&rpar;&comma;获得腿数量的方法 getLegs&lpar;&rpar;&comma;设置动物名称的方法 setKind&lpar;&rpar;&comma;获得动物名称的方法 getKind&lpar;&rpar;&comma;获得动物数量的方法 getCount&lpar;&rpar;。定义Fish类,是Animal类的子类,

    编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...

  4. 怎样用Javascript定义一个类

    其实Javascript中没有类这个定义,但是有类这个概念.很多人都写过这样的代码,对,没错,就是如下代码,清晰的不能再清晰了,就是一个关键字 function,然后定义一个方法名,方法名后紧跟一对括 ...

  5. Python3&period;x:定义一个类并且调用

    Python3.x:定义一个类并且调用 1,定一个类Shrjj(其中有属性:name, jjzt,fbsjj,etf,lof,fjlof): class Shrjj(object): def __in ...

  6. java多线程并发去调用一个类的静态方法安全性探讨

    java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035   这篇文章主要讲多线程对 ...

  7. 定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, 随机的10个字母和数字的组合;字母和数字的范围可以指定,类似(1~100)(A~z)

    #习题2:定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, #随机的10个字母和数字的组合:字母和数字的范围可以指定 class RandomString(): #随机数选择的范围作为 ...

  8. Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter&lpar;&rpar;;在接口InterfaceB中有个方法void printLowercaseLetter&lpar;&rpar;;然 后写一个类Print实现接口InterfaceA和InterfaceB,要求&Tab;方法 实现输出大写英文字母表的功能,printLowerca

    #34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void ...

  9. 代码实现&colon;定义一个文件输入流&comma;调用read&lpar;byte&lbrack;&rsqb; b&rpar;方法&comma;将a&period;txt文件中的内容打印出来&lpar;byte数组大小限制为5&rpar;

    package com.loaderman.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; im ...

随机推荐

  1. Lenovo K29 笔记本经常没声音解决方案Hotkey&lbrack;gevu18ww&rsqb;&period;exe

    下载 win8 快捷键驱动 安装即可解决 http://driverdl.lenovo.com.cn/lenovo/DriverFilesUploadFloder/36265/Hotkey[gevu1 ...

  2. js日期相关

    时间戳转正常日期时间 1469512964000 —> 2016/7/26 下午2:02 var getLocalTime = function(nS) { // 13位时间戳 return n ...

  3. Activemq的连接方式

    http://blog.csdn.net/liangguo03/article/details/7011227 http://blog.csdn.net/johnnie_deng/article/de ...

  4. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C&plus;&plus;模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  5. Asp&period;Net Cookie的清除

    背景 最近做到一个asp.net项目,项目中保存用户信息用到了cookie,因此,在注销身份的时候,就需要清除掉cookie. 探索过程 我先是试验了这种代码,在没有特殊声明前,代码都是写在Page_ ...

  6. SQL Server 2005中的分区表(三):将普通表转换成分区表

    在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底, ...

  7. Hibernate总结(二)---hibernate中的各种映射

    知识的准备: (参考:汤阳光Hibernate3.6(基础)) 一.浅谈javaBean之间的关系 存在的关系: 1.关联(一对一.一对多.多对一.多对多) 2.聚合/组合(最后考虑) 3.继承 所以 ...

  8. web页面在微信里打开,字体颜色不正常显示

    问题:写的web项目在微信里的webview里打开(iphone手机),会出现颜色的不识别.写的是白色,数字的部分会过了3-5秒后,变成黑色! 原因:在iphone手机里,数字的部分(具体的长度没有测 ...

  9. Nodejs 模块查找机制还不错&lpar;从当前目录开始逐级向上查找node&lowbar;modules&rpar;

    比如 m.js是能够调用a.js的, 这样子目录就可以避免重复安装node_modules. 够用了.

  10. PostGIS计算矢量切片&lpar;一&rpar;--渲染数据

        没写错,是使用postgis计算出来矢量切片.在这之前先准备一个数据:一个GIS数据表(本例中数据为一百万的点数据,坐标:4326),并在表中添加x,y字段,方便后面的数据筛选.sql中用到了 ...