Java的集合之算法篇与遗留的集合

四、算法

1>排序与混排

Collections类中的sort方法可以对实现了List接口的集合进行排序。

a>如果想按照降序对列表进行排序,可以使用一种非常方便的静态方法Collections.reverseOrder()。这个方法将返回一个比较器,比较器返回b.compareTo(a)。

例如:Collections.sort(staff,Collections.reverseOrder());

           或者

          Collections.sort(staff,Collections.reverseOrder(itemCompartor));

Collections类实现:(通过逆置itemCompartor的次序)

 public static  Comparator reverseOrder() {
        return (Comparator) ReverseComparator.REVERSE_ORDER;
    }

    /**
     * @serial include
     */
    private static class ReverseComparator
        implements Comparator>, Serializable {

        private static final long serialVersionUID = 7207038068494060240L;

        static final ReverseComparator REVERSE_ORDER
            = new ReverseComparator();

        public int compare(Comparable c1, Comparable c2) {
            return c2.compareTo(c1);
        }

        private Object readResolve() { return reverseOrder(); }
    }
 
    

Collections类有一个算法shuffle,其功能与排序正好相反,即随机地混排列表中元素的顺序。

a>如果列表没有实现RandomAccess接口,shuffle方法将元素复制到数组中,然后打乱数组元素的顺序,最后在将打乱顺序后的元素复制会列表。

2>二分查找

Collections类的binarySearch方法实现了这个算法。注意,集合必须是排好序的,否则将返回错误的答案。

注:只有采用随机访问,二分查找才有意义。如果必须利用迭代方式一次次地遍历链表的一半元素来找到中间位置的元素,二分查找就完全失去了优势。因此,如果为binarySearch算法提供一个链表,它将自动地变为线性查找。

3>简单算法   具体细节查看api文档

4>编写自己的算法

a>在编写自己的算法时(实际上,是以集合为参数的任何方法),应该尽可能使用接口,而不是使用具体的实现。

例如:void fillMenu(ArrayList items);  应该写成  void fillMenu(Collection items);

注:那么为什么在Java类库不更多地使用呢,因为Java类库中许多的类库在集合类库之前创建的。

b>通过使用集合视图来优化算法

List getAllItems(JMenu menu) {
		List items = new ArrayList<>();
		for (int i = 0; i < menu.getItemCount(); i++)
			items.add(menu.getItem(i));
		return items;
	}
List getAllItems(final JMenu menu) {
		return new AbstractList() {

			@Override
			public JMenuItem get(int i) {
				return menu.getItem(i);
			}

			@Override
			public int size() {
				return menu.getItemCount();
			}
		};
	}

五、遗留的集合

1>Hashtable类

Hashtable类与HashMap类的作用一样,实际上,它们拥有相同的接口。与Vector类的方法一样。Hashtable的方法也是同步的。如果对于同步性或遗留代码的兼容性没有任何要求,就应该使用HashMap。

2>枚举

遗留集合使用Enumeration接口对元素序列进行遍历,与Iterator接口类似。

3>属性映射表

属性映射表(property map)是一个类型非常特殊的映射表结构。它有下面3个特性:

a>键与值都是字符串。

b>表可以保存到一个文件中,也可以从文件中加载。

c>使用一个默认的辅助表。

实现属性映射表的Java平台类称为Properties。

属性映射表通常用于程序的特殊配置选项。

4>栈

从1.0开始,标准类库中就包含了Stack类,其中包含push方法和pop方法。但是Stack类扩展为Vector类,从理论角度看,Vector类并不太令人满意,它可以让栈使用不属于栈的insert和remove方法。

5>位集

Java平台的BitSet类用于存放一个位序列。如果需要高效地存放位序列就可以使用位集。由于位集将位包装在字节里,所以,使用位集要比使用Boolean对象的ArrayList更加高效。

你可能感兴趣的:(JAVA核心技术)