From charlesreid1

(Created page with "Here is a link to the Java API docs for the Priority Queue class: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html PriorityQueue is a Java class that im...")
 
No edit summary
Line 1: Line 1:
=Notes=
Here is a link to the Java API docs for the Priority Queue class: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html
Here is a link to the Java API docs for the Priority Queue class: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html


Line 4: Line 6:


Some links related to sorting in Java:
Some links related to sorting in Java:
* [[Java/Sorting]] - notes on sorting in Java
* [[Java/Comparable]] - built-in comparison functionality for objects
* [[Java/Comparable]] - built-in comparison functionality for objects
* [[Java/Comparators]] - standalone object for comparing two other objects
* [[Java/Comparators]] - standalone object for comparing two other objects
=Example=
The simple example below uses a custom comparator when constructing a priority queue. This implements a queue that adds the shortest Strings to the front of the queue. The driver code adds a series of strings whose lengths are in reverse alphabetical order, and we print the results of adding them to a Priority Queue object using our custom string length comparator (in which shorter strings come first), then the results of adding them to a normal Priority Queue object (which by default uses natural ordering, or lexicographical string ordering, alphabetical first).
<pre>
import java.util.PriorityQueue;
import java.util.Comparator;
/**
* String Comparison Priority Queue.
*
* This class demonstrates the use of a comparator
* with the built-in PriorityQueue class
* to allow sorting of data according to
* aribtrary criteria.
*
* Note that the built-in PriorityQueue class
* uses a single templated type <E> as both
* the key and the value, so you can pass in a
* comparator and it will sort each element value
* (which is also its own key) using that comparator.
*/
public class StringComparisonPQ {
public static void main(String[] args) {
System.out.println("Length comparator:");
// the initial capacity (first integer argument) does not seem to matter at all
PriorityQueue<String> q = new PriorityQueue<String>(1,new StringLengthComparator());
q.add("aaaaaaaaaaaaaaaaaaaaaaa");
q.add("cccccccccccccccc");
q.add("bbbbbbbbbbbbbbbbbbb");
q.add("eeeeeeeeeee");
q.add("ddddddddddddddd");
q.add("yyyyyy");
q.add("wwwwwwww");
q.add("z");
while(!q.isEmpty()) {
System.out.println(q.remove());
}
System.out.println();
System.out.println("No comparator:");
PriorityQueue<String> q2 = new PriorityQueue<String>(1);
q2.add("aaaaaaaaaaaaaaaaaaaaaaa");
q2.add("ddddddddddddddd");
q2.add("bbbbbbbbbbbbbbbbbbb");
q2.add("cccccccccccccccc");
q2.add("z");
q2.add("yyyyyy");
q2.add("wwwwwwww");
q2.add("eeeeeeeeeee");
while(!q2.isEmpty()) {
System.out.println(q2.remove());
}
}
}
class StringLengthComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() < s2.length()) {
// arg 22 greater than arg 1
return -1;
} else if(s1.length() > s2.length()) {
// arg 1 greater than arg 2
return 1;
} else {
// equals case
return 0;
}
}
}
</pre>
==output==
<pre>
$ javac StringComparisonPQ.java && java StringComparisonPQ
Length comparator:
z
yyyyyy
wwwwwwww
eeeeeeeeeee
ddddddddddddddd
cccccccccccccccc
bbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaa
No comparator:
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
cccccccccccccccc
ddddddddddddddd
eeeeeeeeeee
wwwwwwww
yyyyyy
z
</pre>

Revision as of 01:27, 25 June 2017

Notes

Here is a link to the Java API docs for the Priority Queue class: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

PriorityQueue is a Java class that implements a queue where elements in the queue have keys, and each item is sorted according to its key value.

Some links related to sorting in Java:

Example

The simple example below uses a custom comparator when constructing a priority queue. This implements a queue that adds the shortest Strings to the front of the queue. The driver code adds a series of strings whose lengths are in reverse alphabetical order, and we print the results of adding them to a Priority Queue object using our custom string length comparator (in which shorter strings come first), then the results of adding them to a normal Priority Queue object (which by default uses natural ordering, or lexicographical string ordering, alphabetical first).

import java.util.PriorityQueue;
import java.util.Comparator;

/** 
 * String Comparison Priority Queue.
 *
 * This class demonstrates the use of a comparator 
 * with the built-in PriorityQueue class
 * to allow sorting of data according to 
 * aribtrary criteria.
 *
 * Note that the built-in PriorityQueue class
 * uses a single templated type <E> as both 
 * the key and the value, so you can pass in a 
 * comparator and it will sort each element value
 * (which is also its own key) using that comparator.
 */
public class StringComparisonPQ {
	public static void main(String[] args) { 

		System.out.println("Length comparator:");

		// the initial capacity (first integer argument) does not seem to matter at all
		PriorityQueue<String> q = new PriorityQueue<String>(1,new StringLengthComparator());
		q.add("aaaaaaaaaaaaaaaaaaaaaaa");
		q.add("cccccccccccccccc");
		q.add("bbbbbbbbbbbbbbbbbbb");
		q.add("eeeeeeeeeee");
		q.add("ddddddddddddddd");
		q.add("yyyyyy");
		q.add("wwwwwwww");
		q.add("z");
		while(!q.isEmpty()) { 
			System.out.println(q.remove());
		}
		
		System.out.println();

		System.out.println("No comparator:");

		PriorityQueue<String> q2 = new PriorityQueue<String>(1);
		q2.add("aaaaaaaaaaaaaaaaaaaaaaa");
		q2.add("ddddddddddddddd");
		q2.add("bbbbbbbbbbbbbbbbbbb");
		q2.add("cccccccccccccccc");
		q2.add("z");
		q2.add("yyyyyy");
		q2.add("wwwwwwww");
		q2.add("eeeeeeeeeee");
		while(!q2.isEmpty()) { 
			System.out.println(q2.remove());
		}

	}
}

class StringLengthComparator implements Comparator<String> {
	public int compare(String s1, String s2) { 
		if(s1.length() < s2.length()) {
			// arg 22 greater than arg 1
			return -1;
		} else if(s1.length() > s2.length()) {
			// arg 1 greater than arg 2
			return 1;
		} else {
			// equals case
			return 0;
		}
	}
}

output

$ javac StringComparisonPQ.java && java StringComparisonPQ
Length comparator:
z
yyyyyy
wwwwwwww
eeeeeeeeeee
ddddddddddddddd
cccccccccccccccc
bbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaa

No comparator:
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
cccccccccccccccc
ddddddddddddddd
eeeeeeeeeee
wwwwwwww
yyyyyy
z