Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.nio.CharBuffer;
- import java.text.Collator;
- import java.util.Comparator;
- import static java.nio.CharBuffer.wrap;
- public class UnidadeComparador implements Comparator<Unidade>{
- private final Collator collator;
- public UnidadeComparador() {
- collator = null;
- }
- public int compare(final Unidade s1, final Unidade s2) {
- final CharBuffer b1 = wrap(s1.getNome());
- final CharBuffer b2 = wrap(s2.getNome());
- while (b1.hasRemaining() && b2.hasRemaining()) {
- moverJanela(b1);
- moverJanela(b2);
- final int result = comparar(b1, b2);
- if (result != 0) {
- return result;
- }
- preparaParaProximaInteracao(b1);
- preparaParaProximaInteracao(b2);
- }
- return s1.getNome().length() - s2.getNome().length();
- }
- private void moverJanela(final CharBuffer buffer) {
- int start = buffer.position();
- int end = buffer.position();
- final boolean isNumerical = isDigito(buffer.get(start));
- while (end < buffer.limit() && isNumerical == isDigito(buffer.get(end))) {
- ++end;
- if (isNumerical && (start + 1 < buffer.limit())
- && isZero(buffer.get(start)) && isDigito(buffer.get(end))) {
- ++start;
- }
- }
- buffer.position(start).limit(end);
- }
- private int comparar(final CharBuffer b1, final CharBuffer b2) {
- if (isNumero(b1) && isNumero(b2)) {
- return compararNumerico(b1, b2);
- }
- return compararStrings(b1, b2);
- }
- private boolean isNumero(final CharBuffer buffer) {
- return isDigito(buffer.charAt(0));
- }
- private boolean isDigito(final char c) {
- if (collator == null) {
- final int intValue = (int) c;
- return intValue >= 48 && intValue <= 57;
- }
- return Character.isDigit(c);
- }
- private int compararNumerico(final CharBuffer b1, final CharBuffer b2) {
- final int diff = b1.length() - b2.length();
- if (diff != 0) {
- return diff;
- }
- for (int i = 0; i < b1.remaining() && i < b2.remaining(); ++i) {
- //final int result = Character.comparar(b1.charAt(i), b2.charAt(i));
- final int result = Character.valueOf(b1.charAt(i))
- .compareTo(Character.valueOf(b2.charAt(i)));
- if (result != 0) {
- return result;
- }
- }
- return 0;
- }
- private void preparaParaProximaInteracao(final CharBuffer buffer) {
- buffer.position(buffer.limit()).limit(buffer.capacity());
- }
- private int compararStrings(final CharBuffer b1, final CharBuffer b2) {
- if (collator != null) {
- return collator.compare(b1.toString(), b2.toString());
- }
- return b1.toString().compareTo(b2.toString());
- }
- private boolean isZero(final char c) {
- return c == '0';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement