Java集合类的学习(六)——总结

1.6        总结:集合框架中常用类比较

用“集合框架”设计软件时,记住该框架四个基本接口的下列层次结构关系会有用处:

· Collection 接口是一组允许重复的对象。 

· Set 接口继承 Collection,但不允许重复。 

· List 接口继承 Collection,允许重复,并引入位置下标。 

· Map 接口既不继承 Set 也不继承 Collection, 存取的是键值对 

我们以下面这个图表来描述一下常用的集合的实现类之间的区别:

Collection/Map

接口

成员重复性

元素存放顺序(Ordered/Sorted

元素中被调用的方法

基于那中数据结构来实现的

HashSet

Set

Unique elements

No order

equals()

hashCode()

Hash 

LinkedHashSet

Set

Unique elements

Insertion order

equals()

hashCode()

Hash 表和双向链表

TreeSet

SortedSet

Unique elements

Sorted

equals()

compareTo()

平衡树(Balanced tree

ArrayList

List

Allowed

Insertion order

equals()

数组

LinkedList

List

Allowed

Insertion order

equals()

链表

Vector

List

Allowed

Insertion order

equals()

数组

HashMap

Map

Unique keys

No order

equals()

hashCode()

Hash 

LinkedHashMap

Map

Unique keys

Key insertion order/Access order of entries

equals()

hashCode()

Hash 表和双向链表

Hashtable

Map

Unique keys

No order

equals()

hashCode()

Hash 

TreeMap

SortedMap

Unique keys

Sorted in key order

equals()

compareTo()

平衡树(Balanced tree

2        练习

撰写一个Person class,表示一个人员的信息。令该类具备多辆Car的信息,表示一个人可以拥有的车子的数据,以及: 

Certificate code: 身份证对象

name: 姓名

cash: 现金

List car;  拥有的汽车,其中存放的是Car对象

boolean buycar(car);  买车子

boolean sellcar(Person p);//把自己全部的车子卖给别人

boolean buyCar(Car car,Person p);//自动查找卖车的人p是否有买主想要买的车car,如果有就买,并返回true ,否则返回false

viod addCar(car);//把某辆车送给方法的调用者。

String toString();//得到人的信息

并撰写第二个Car class 具备的属性:

String ID;  //ID车牌号

cost  //价格

color //颜色

Person owner; //车子的拥有者

toString();//得到汽车的信息

equals();//比较车子是否同一俩汽车,ID相同则认为相同

在另外一个Market类里面,进行车子的买卖。并保留所有交易人员的的信息到一个HashMap中,我们可以通过身份证号来查找到对应的人员的信息。同时所有的车子种类都在市场中进行注册,即车子的信息使用一个Set来保存

属性:

HashMap people;//存放交易人员的信息。Key为身份证号,value为Person对象

方法:

static boolean sellCar(Person p1 ,Car car1, Person p2); 

//p1 将car1卖给 p2 。并在该方法中记录效益人的信息到people 中。

撰写类Certificate 表示身份证:

属性:

Id;//号码

方法:

equals();//比较两个身份证是否同一个,ID相同则认为相同

hashCode();//正确编写hashCode 方法

 

场景:

一个叫Bob的人:身份证:310  现金:30000。

有一辆车子:ID:001,红色,价格:50000的车子;

一个叫Tom的人:身份证:210 现金:70000,  

有一辆车子: 颜色:白色,ID:003, 价格:25000。

一个叫King 的人:身份证:245 现金:60000,  

有2辆车子: 颜色:白色,ID:005, 价格:18000。

颜色:红色,ID:045, 价格:58000。

 

Tom 买了Bob的车子.他就拥有了2辆汽车 

King 把ID=005的车子买给了Bob 

最后各人的信息如何?

3        附录:排序

为了用“集合框架”的额外部分把排序支持添加到 Java 2 SDK,版本 1.2,核心 Java 库作了许多更改。像 String 和 Integer 类如今实现 Comparable 接口以提供自然排序顺序。对于那些没有自然顺序的类、或者当您想要一个不同于自然顺序的顺序时,您可以实现 Comparator 接口来定义您自己的。

为了利用排序功能,“集合框架”提供了两种使用该功能的接口:SortedSet 和 SortedMap。

Comparable 接口 

在 java.lang 包中,Comparable 接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许您把集合排序成自然顺序。

compareTo() 方法比较当前实例和作为参数传入的元素。如果排序过程中当前实例出现在参数前,就返回某个负值。如果当前实例出现在参数后,则返回正值。否则,返回零。这里不要求零返回值表示元素相等。零返回值只是表示两个对象排在同一个位置。

在 Java 2 SDK,版本 1.2 中有十四个类实现 Comparable 接口。下表展示了它们的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。

排序

BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short 

按数字大小排序

Character 

按 Unicode 值的数字大小排序

CollationKey 

按语言环境敏感的字符串排序

Date 

按年代排序

File 

按系统特定的路径名的全限定字符的 Unicode 值排序

ObjectStreamField 

按名字中字符的 Unicode 值排序

String 

按字符串中字符 Unicode 值排序

创建您自己的类 Comparable 只是个实现 compareTo() 方法的问题。通常就是依赖几个数据成员的自然排序。您自己的类也应该覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个散列码。

Comparator 接口 

若一个类不能用于实现 java.lang.Comparable,您可以提供自己的 java.util.Comparator 行为。如果您不喜欢缺省的 Comparable 行为,您照样可以提供自己的 Comparator。

Comparator 的 compare() 方法的返回值和 Comparable 的 compareTo() 方法的返回值相似。在此情况下,如果排序时第一个元素出现在第二个元素之前,则返回一个负值。如果第一个元素出现在后,那么返回一个正值。否则,返回零。与 Comparable 相似,零返回值不表示元素相等。一个零返回值只是表示两个对象排在同一位置。由 Comparator 用户决定如何处理。如果两个不相等的元素比较的结果为零,您首先应该确信那就是您要的结果,然后记录行为。

为了演示,您会发现编写一个新的忽略大小写的 Comparator,代替使用 Collator 进行语言环境特定、忽略大小写的比较会更容易。这样的一种实现如下所示:

class CaseInsensitiveComparator implements Comparator {

  public int compare(Object element1, Object element2) {

    String lowerE1 = ((String)element1).toLowerCase();

    String lowerE2 = ((String)element2).toLowerCase();

    return lowerE1.compareTo(lowerE2);

  }

}

因为每个类在某些地方都建立了 Object 子类,所以这不是您实现 equals() 方法的必要条件。实际上大多数情况下您不会去这样做。切记该 equals() 方法检查的是 Comparator 实现的等同性,不是处于比较状态下的对象。

Collections 类有个预定义的 Comparator 用于重用。调用 Collections.reverseOrder() 返回一个 Comparator,它对逆序实现 Comparable 接口的对象进行排序。


需要PDF文档可以去这里下载:http://download.csdn.net/detail/my_session/4555903

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您继续解答关于Java导出List集合到txt文件中的问题。 在上一篇文章中,我们已经学习了如何将List集合中的数据写入到txt文件中。接下来,我们需要考虑如何将List集合中的数据格式化后写入到txt文件中。 我们可以使用Java中的String.format()方法来格式化输出数据。下面是一个示例代码: ```java List<String> dataList = new ArrayList<String>(); // 添加数据到dataList中 ... // 创建文件输出流 FileOutputStream fos = new FileOutputStream("output.txt"); // 创建输出流写入器 OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); // 创建缓冲写入器 BufferedWriter bw = new BufferedWriter(osw); // 格式化数据并写入到txt文件中 for (String data : dataList) { String formattedData = String.format("%-10s%-10s%-10s", data.getField1(), data.getField2(), data.getField3()); bw.write(formattedData); bw.newLine(); } // 关闭缓冲写入器 bw.close(); ``` 在这个示例代码中,我们假设List集合中存储的是一个自定义的对象,该对象有三个字段:field1、field2、field3。我们使用String.format()方法将这些字段格式化成长度为10的字符串,并使用%-10s指定左对齐方式。 最后,我们使用BufferedWriter将格式化后的数据写入到txt文件中,并使用newLine()方法添加一个换行符,以便下次写入时数据不会覆盖之前的数据。 希望这个示例代码对你有所帮助!如果您还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值