Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Here's (1) a really efficient, generic way to do it and (2) a simple and effective way.</p> <p>(1) In the first sort, I compute and cache the number of occurrences of the digit 5 once per value in the array. Then I use a generic sort method to sort based on the cached values. This is better than a custom comparator because the number of occurrences is only computed once per element in the list.</p> <p>(2) In the second sort, I simply use a custom comparator, which is more simple to implement.</p> <p>Sorts (3) and (4) do the same thing as (1) and (2) respectively using Strings rather than Integers.</p> <pre><code>import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.ListIterator; public class DigitSort { public static void main(String[] args) { List&lt;Integer&gt; initInt = Arrays.asList(555, 55, 5, 101, 202); final int sortDigit = 5; // sort #1 List&lt;Integer&gt; ints = new ArrayList&lt;&gt;(initInt); sort(ints, new ToComparable&lt;Integer, DigitComparable&gt;() { @Override public DigitComparable toComparable(Integer number) { return number == null ? null : new DigitComparable(number, digitCount(sortDigit, number)); } }); System.out.println("Results of int generic sort:"); for (Integer number : ints) System.out.println(number); // sort #2 ints = new ArrayList&lt;&gt;(initInt); Collections.sort(ints, new Comparator&lt;Integer&gt;() { @Override public int compare(Integer number1, Integer number2) { if (number1 == null &amp;&amp; number2 == null) return 0; if (number1 == null) return -1; if (number2 == null) return 1; int digitCount1 = digitCount(sortDigit, number1); int digitCount2 = digitCount(sortDigit, number2); return digitCount1 &gt; 0 &amp;&amp; digitCount2 &gt; 0 ? digitCount1 - digitCount2 : digitCount2 &gt; 0 ? -1 : digitCount1 &gt; 0 ? 1 : number1 - number2; } }); System.out.println("\nResults of int comparator sort:"); for (Integer number : ints) System.out.println(number); List&lt;String&gt; initString = new ArrayList&lt;&gt;(initInt.size()); for (Integer number : initInt) initString.add(number == null ? null : number.toString()); // sort #3 List&lt;String&gt; strings = new ArrayList&lt;&gt;(initString); sort(strings, new ToComparable&lt;String, DigitComparable&gt;() { @Override public DigitComparable toComparable(String number) { if (number == null) return null; int asInt = Integer.parseInt(number); return new DigitComparable(asInt, digitCount(sortDigit, asInt)); } }); System.out.println("\nResults of string generic sort:"); for (String number : strings) System.out.println(number); // sort #4 strings = new ArrayList&lt;&gt;(initString); Collections.sort(strings, new Comparator&lt;String&gt;() { @Override public int compare(String number1, String number2) { if (number1 == null &amp;&amp; number2 == null) return 0; if (number1 == null) return -1; if (number2 == null) return 1; int digitCount1 = digitCount(sortDigit, number1); int digitCount2 = digitCount(sortDigit, number2); return digitCount1 &gt; 0 &amp;&amp; digitCount2 &gt; 0 ? digitCount1 - digitCount2 : digitCount2 &gt; 0 ? -1 : digitCount1 &gt; 0 ? 1 : Integer.parseInt(number1) - Integer.parseInt(number2); } }); System.out.println("\nResults of string comparator sort:"); for (String number : strings) System.out.println(number); } private static class DigitComparable implements Comparable&lt;DigitComparable&gt; { private final int number, digitCount; DigitComparable(int number, int digitCount) { this.number = number; this.digitCount = digitCount; } @Override public int compareTo(DigitComparable other) { return digitCount &gt; 0 &amp;&amp; other.digitCount &gt; 0 ? digitCount - other.digitCount : other.digitCount &gt; 0 ? -1 : digitCount &gt; 0 ? 1 : number - other.number; } } protected static int digitCount(int digit, String number) { char asChar = Character.forDigit(digit, 10); int count = 0; for (char c : number.toCharArray()) if (c == asChar) ++count; return count; } protected static int digitCount(int digit, int number) { number = Math.abs(number); int count = 0; while (number != 0) { if (number % 10 == digit) ++count; number /= 10; } return count; } public interface ToComparable&lt;T, C extends Comparable&lt;? super C&gt;&gt; { C toComparable(T t); } public static &lt;T, C extends Comparable&lt;? super C&gt;&gt; void sort(List&lt;T&gt; list, ToComparable&lt;T, C&gt; function) { class Pair implements Comparable&lt;Pair&gt; { final T original; final C comparable; Pair(T original, C comparable) { this.original = original; this.comparable = comparable; } @Override public int compareTo(Pair other) { return comparable == null &amp;&amp; other.comparable == null ? 0 : comparable == null ? -1 : other.comparable == null ? 1 : comparable.compareTo(other.comparable); } } List&lt;Pair&gt; pairs = new ArrayList&lt;&gt;(list.size()); for (T original : list) pairs.add(new Pair(original, function.toComparable(original))); Collections.sort(pairs); ListIterator&lt;T&gt; iter = list.listIterator(); for (Pair pair : pairs) { iter.next(); iter.set(pair.original); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload