`
forever8tf
  • 浏览: 99012 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java实现可泛型的Heap

阅读更多

可泛型的Heap,方便使用。

Heap接口:

 

public interface Heap<T>
{
	/**
	 * return the top element of the heap
	 * 
	 * @return top element
	 */
	Object get();

	/**
	 * remove the top element of the heap and return it the heap must be fixed.
	 * 
	 * @return top element
	 */
	Object remove();

	/**
	 * reset the top element
	 * 
	 * @param obj
	 *            the new top element
	 */
	void set(T obj);

	/**
	 * add a element to the heap. if no comparator is set, the obj must be
	 * implments comparable interface
	 * 
	 * @param obj
	 *            the element to be added
	 */
	void add(T obj);

	/**
	 * if the heap is empty return true;
	 * 
	 * @return true if heap is empty,else false
	 */
	boolean isEmpty();

	/**
	 * clear the heap
	 */
	void clear();
}

 AbstractHeap类:

public class AbstractHeap<T> implements Heap<T>{

	private List<T> l = new ArrayList<T>(128);

	private Comparator<T> com;
	

	/*
     * 默认构造器
     * 接受泛型的数组
     */
	public AbstractHeap(T[] elements)
	{
		init(elements);
	}

	/*
     * 带Comparator的构造器
     * 如果com为null会抛出IllegalArgumentException
     */
	public AbstractHeap(Comparator<T> com, T[] elements)
	{
		if (com == null)
			throw new IllegalArgumentException("compartor can't be null");
		this.com = com;
		init(elements);
	}

	/*
     * 初始化Heap中的ArrayList
     */
	private void init(T[] elements)
	{
		l.add(null);
		for (int i = 0; i < elements.length; i++)
		{
			add(elements[i]);
		}
		System.out.println("Queue length is : " + l.size());
		System.out.println("Content is : " + l);
	}

	/*
     * 得到堆顶的元素
     */
	@Override
	public Object get()
	{
		return l.get(1);
	}

	/*
     * 移除堆顶端元素,并重新维护Heap
     */
	@Override
	public T remove()
	{
		T toReturn = l.get(1);
		T ret = l.get(l.size() - 1);
		l.set(1, ret);
		l.remove(l.size() - 1);
		
		fixDown(1);

		System.out.println("Queue length is : " + l.size());
		System.out.println("Content is : " + l);
		return toReturn;
	}
	/*
     * 检测Heap是否为空
     */
	@Override
	public boolean isEmpty()
	{
		return l.size() == 0;
	}

	/*
     * 情况Heap中所有元素
     */
	@Override
	public void clear()
	{
		l.clear();
	}

	/*
     * 将堆顶元素替换,并重新维护Heap
     */
	@Override
	public void set(T obj)
	{
		l.set(1, obj);
		fixDown(1);
	}

	/*
     * 向Heap中加入一个元素
     */
	@Override
	public void add(T obj)
	{
		l.add(obj);
		fixUP(l.size());
	}

	/*
     * 比较器
     */
	protected int compare(int i, int j) throws NoComparableException
	{
		if (com != null)
		{
			return com.compare(l.get(i), l.get(j));
		}
		else if (l.get(j) instanceof Comparable)
		{
			return ((Comparable) l.get(i)).compareTo(l.get(j));
		}
		else
		{
			throw new NoComparableException(
					"Not implements Comparable interface.");
		}
	}

	/*
     * 比较器
     */
	protected int compare(T i, T j) throws NoComparableException
	{
		if (com != null)
		{
			return com.compare(i, j);
		}
		else if (i instanceof Comparable)
		{
			return ((Comparable) i).compareTo(j);
		}
		else
		{
			throw new NoComparableException(
					"Not implements Comparable interface.");
		}
	}

	/*
     * 向上维护
     */
	private void fixUP(int start)
	{
		int k = start - 1;
		T s = l.get(k);
		try
		{
			while (k != 1 && compare(l.get(k >> 1), s) <= 0)
			{
				l.set(k, l.get(k >> 1));
				k >>= 1;

			}
		} catch (NoComparableException e)
		{
			e.printStackTrace();
		}
		l.set(k, s);
	}

	/*
     * 向下维护
     */
	private void fixDown(int k)
	{
		T ret = l.get(k);
		int j = k;
		int r = j * 2;
		int size = l.size() - 1;
		while (r <= size)
		{
			try
			{
				if (r < size && compare(l.get(r + 1), l.get(r)) > 0)
					r++;
				if (compare(l.get(r), ret) < 0)
					break;
			} catch (NoComparableException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			l.set(j, l.get(r));
			j = r;
			r *= 2;
		}
		l.set(j, ret);
	}
}

  最小推,MinHeap:

 

public class MinHeap<T> extends AbstractHeap<T>
{

	public MinHeap(T[] elements)
	{
		super(elements);
	}

	public MinHeap(Comparator<T> com, T[] elements)
	{
		super(com, elements);
	}

	/*
     * 注意两个参数比较的顺序
     */
	@Override
	protected int compare(int i, int j) throws NoComparableException
	{
		return super.compare(j, i);
	}

	@Override
	protected int compare(T i, T j) throws NoComparableException
	{
		return super.compare(j, i);
	}
}

 最大堆,MaxHeap:

 

public class MaxHeap<T> extends AbstractHeap<T>
{

	public MaxHeap(T[] elements)
	{
		super(elements);
	}

	public MaxHeap(Comparator<T> com, T[] elements)
	{
		super(com, elements);
	}

	/*
     * 注意两个参数比较的顺序
     */
	@Override
	protected int compare(int i, int j) throws NoComparableException
	{
		return super.compare(i, j);
	}

	@Override
	protected int compare(T i, T j) throws NoComparableException
	{
		return super.compare(i, j);
	}
}
分享到:
评论

相关推荐

    JAVA核心知识点整理

    * 泛型:用于实现JAVA程序的类型安全和可扩展性。 * lambda表达式:用于实现JAVA程序的函数式编程和事件处理。 Java框架和库 JAVA框架和库是JAVA语言的高级组件之一,包括Spring框架、MyBatis框架、Hibernate框架...

    10道腾讯的Java面试题答案.zip

    - 解答:Java内存分为堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。堆用于存储对象实例,栈用于存储基本类型和引用,方法区存储...

    java核心知识点整理.pdf

    Java语言具有跨平台性、面向对象、分布式、动态、泛型等特点。 Java虚拟机(JVM) Java虚拟机(JVM)是Java语言的运行环境,负责解释和执行Java字节码。JVM是Java语言的核心组件,提供了平台独立性、内存管理和...

    《HEADFIRSTJAVA》--深入浅出Java说明与归纳.pdf

    9. Java内存模型:Java的内存模型分为堆(heap)和栈(stack)。栈用于存储局部变量和方法调用,堆用于存储对象实例。Java有垃圾收集器来管理内存,自动回收不再被引用的对象所占用的内存。 10. Java继承与覆盖:...

    java入门笔记.pdf

    文档中介绍了类加载器、反射的使用、注解等高级概念,这些都是在编写动态、灵活的Java应用程序时不可或缺的知识点。 ### Java新特性 随着Java版本的不断更新,引入了许多新的特性。文档中提到了JDK新特性,例如泛型...

    Java常见面试题及答案

    Java是一种广泛使用的面向对象的编程语言,其设计目标是具有高度的可移植性、健壮性和安全性。在软件开发领域,尤其是企业级应用和互联网应用中,Java的重要性不言而喻。因此,对于求职者来说,掌握Java的核心概念和...

    java编程常用英语单词解释

    在 Java 编程中,英语单词是必不可少的一部分。了解这些单词的解释将有助于我们更好地理解和使用 Java 语言。下面是 Java 编程常用英语单词的解释: 1. Abstract(关键字):抽象的,指的是不能被实例化的类或接口...

    java api中文版chm

    Java通过方法重写(Override)和接口实现实现多态性,增强了程序的灵活性和可扩展性。 5. **接口(Interface)**:接口是一种完全抽象的类型,只包含常量和抽象方法。一个类可以实现多个接口,通过`implements`...

    Java虚拟机规范(Java SE 7)-完整目录书签文字版

    此外,Java SE 7还增强了类型推断(Type Inference)功能,使得泛型使用更加便捷;引入了Try-with-Resources语句,简化了资源关闭的处理;并且增强了并发编程的支持,如Fork/Join框架和新的并发集合类。 总结起来,...

    Java入门基础.pdf

    * HashMap的实现原理 * HashMap源码剖析 IO流 * IO流基础 * File类 * 字节流 * 字符流 * 常用IO流 * NIO工具类 * AIO和序列化流 网络编程 * 网络编程基础 * HTTP、TCP、UDP、Socket * 计算机网络知识 * HTTPS...

    Java后端面试问题整理.docx

    - Java基础部分还可能涉及泛型、序列化、内部类、注解等深入话题。 了解并掌握这些知识点,对于Java后端开发者来说,不仅能在面试中表现出色,也能在实际工作中更好地解决性能问题和编写高质量的代码。

    【BAT必备】Java面试题

    Java泛型的主要优点包括: - **类型安全**:编译期检查类型,避免运行时ClassCastException。 - **代码复用**:编写一次,适用于多种类型。 - **提高可读性**:增强代码的自文档化。 #### 15. 泛型擦除是什么意思...

    Java基础知识点汇总

    - **泛型实现方法**:通过在类或接口声明时添加类型参数来实现泛型。例如,定义一个泛型类`Box&lt;T&gt;`,在实例化时通过传递具体的类型如`Box&lt;String&gt;`来确定`T`的实际类型。 #### 3. Java中静态变量的适用场景 静态...

    Java面试常问题目.pdf

    10. Java泛型: - 泛型允许在编译时提供类型检查和类型安全,使得不同类型的集合可以实现同一个接口。 - 例如,List可以持有任何类型的对象,List只能持有String类型的对象。 11. Java集合框架中的线程安全和非...

    Java基础重点.rar_java面试会问到的问题2

    10. **泛型**:Java泛型的引入增强了类型安全,面试官可能询问泛型的边界、通配符、类型擦除等概念。 11. **注解(Annotation)**:注解提供了一种元数据方式,面试官可能询问自定义注解的创建和使用,以及反射中...

    小禾青青公司Java笔试题

    以上只是Java编程领域的一部分关键知识点,实际的笔试题可能还会涉及更多的内容,例如枚举、泛型、并发编程、数据库操作、Spring框架等。对这些知识的掌握程度将直接影响到应聘者在面试和实际工作中的表现。

    java常用词汇汇总

    - **用途**:Java中的泛型允许在类、接口和方法中使用类型参数,从而实现类型安全的代码重用。 #### goto (保留字) 跳转 - **中文释义**:跳转 - **用途**:虽然`goto`是Java中的保留字,但实际上并未被用作关键字...

    Java Developer's Guide

    7. **高级特性**:讨论Java的一些高级特性,例如反射、注解、泛型等。 8. **工具与环境**:提供有关设置开发环境的信息,包括IDE选择、构建工具等。 9. **最佳实践与设计模式**:分享编写高质量代码的最佳实践和常用...

    深入理解_Java_虚拟机_(JVM_高级特性与最佳实践)

    Java 5引入了泛型和自动装箱拆箱功能,极大地提高了代码的复用性和可读性。泛型允许编译器在编译阶段检查类型安全,并确保编译后的类文件不包含类型信息,从而减少运行时的类型转换开销。自动装箱是指将基本类型自动...

Global site tag (gtag.js) - Google Analytics