/*
* Copyright © 2013 - Elliott Frisch
*
* THIS SOFTWARE IS PROVIDED UNDER THE CREATIVE COMMONS
* LICENSE 3.0 "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
* A PARTICULAR PURPOSE.
*
* To use this software you must agree to the complete
* license terms available at:
* http://creativecommons.org/licenses/by/3.0/us/deed.en_US
*
* It is the intent of the author(s) that you may use or
* modify this software for any purpose (including your own
* commercial gain) provided that this notice remains in its
* entirety.
*
* Created by Elliott Frisch - www.frischcode.com
*/
package com.frischcode.util;
import java.util.Arrays;
import java.util.Comparator;
/**
* <b>Rationale:</b> Frequently you need to <a href=
* "http://tinyurl.com/2dr3buq">reverse the polarity</a> of
* a Comparator (e.g. from Ascending to Descending or
* vice-versa). Implemented with two <a href=
* "http://tinyurl.com/65d2m">Design Patterns</a>;
* <ol>
* <li><a href="http://tinyurl.com/r6gcx">Decorator</a></li>
* <li>
* <a href="http://tinyurl.com/muw5h">Factory method</a></li>
* </ol>
* <b>NOTE:</b> The Factory method pattern is used to
* prevent nesting.
*
* @author Elliott Frisch
*/
public class ReverseComparator<T> implements
Comparator<T> {
/**
* Performs "lite" Construction assistance for reversing a
* Comparator while preventing "deep" nesting. By design,
* the reverse of the reverse is a reference to the
* original Comparator.
*
* @param comparator
* The comparator to reverse.
* @return A comparator that behaves in the opposite
* manner to that initially provided.
*/
public static <R> Comparator<R> reverseComparator(
final Comparator<R> comparator) {
if (comparator == null) {
return null;
} else if (comparator instanceof ReverseComparator) {
return ((ReverseComparator<R>) comparator).comparator;
}
return new ReverseComparator<R>(comparator);
}
/**
* Provide a basic demonstration.
*
* @see com.frischcode.util.ComparableComparator
*/
public static void main(String[] args) {
String[] array = new String[] { "Hello", "World",
"Goodbye", "It's" };
// java.lang.String is Comparable.
// Help! I have a Comparable but I need a Comparator...
// http://tinyurl.com/lg5pyvy
Comparator<String> comp = new ComparableComparator<String>();
Comparator<String> comp2 = reverseComparator(comp);
Comparator<String> comp3 = reverseComparator(comp2);
if (comp == comp3) {
System.out.println("The Reverse Reverse "
+ "Comparator refers to the initial "
+ "Comparator");
} else {
System.err.println("The Reverse Reverse "
+ "Comparator DOES NOT refer to "
+ "the initial Comparator");
}
printArray("Initial", array);
Arrays.sort(array, comp);
printArray("Normal Sort", array);
Arrays.sort(array, comp2);
printArray("Reverse Sort", array);
}
// Outputs an array.
private static void printArray(final String state,
final String[] array) {
final StringBuilder sb = new StringBuilder(state);
sb.append(" Array = [");
for (int i = 0; i < array.length; ++i) {
if (i != 0) {
sb.append(", ");
}
sb.append(array[i]);
}
sb.append("]");
System.out.println(sb.toString());
}
/**
* Do the opposite of our decorated Comparator.
*
* @see java.util.Comparator#compare(java.lang.Object,
* java.lang.Object)
*/
@Override
public int compare(final T o1, final T o2) {
return (comparator != null) ? comparator.compare(
o2, o1) : 0;
}
// To prevent nested instantiation.
private ReverseComparator(
final Comparator<T> comparator) {
this.comparator = comparator;
}
private final Comparator<T> comparator;
}
Code Pretty Print Script
Friday, November 8, 2013
Reverse the Polarity
Sometimes, you need to reverse the polarity of a Comparator and it should be smart so that you can reverse the Comparator over and over again without consuming more resources.
Subscribe to:
Post Comments
(
Atom
)
Casino - Strivr - Strivr | JMTHub
ReplyDeleteHotel deals 속초 출장안마 on Hotel - 김포 출장마사지 Strivr at Strivr - Strivr: Book now! Check prices, photos & reviews. Save up to 세종특별자치 출장마사지 60% off with our Hot Rate deals 충청남도 출장마사지 when booking 시흥 출장샵 a last