Advertisement
Guest User

sorting by digits

a guest
Jan 24th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. import java.util.Arrays;
  2.  
  3. public class Sort {
  4.  
  5. private static int[] decimalToDigits(int decimal) {
  6. String temp = Integer.toString(decimal);
  7. int[] digits = new int[temp.length()];
  8. for (int i = 0; i < temp.length(); i++)
  9. {
  10. digits[i] = temp.charAt(i) - '0';
  11. }
  12.  
  13. return digits;
  14. }
  15.  
  16. private static int compareNumbers(Object o1, Object o2) {
  17. int i1 = (int) o1;
  18. int i2 = (int) o2;
  19.  
  20. if (i1 == i2) return 0;
  21.  
  22. int[] digits1 = decimalToDigits(i1);
  23. int[] digits2 = decimalToDigits(i2);
  24.  
  25. int i;
  26. for (i = 0; i < digits1.length && i < digits2.length; i++) {
  27. if (digits1[i] == digits2[i]) {
  28. continue;
  29. }
  30. return digits2[i] - digits1[i];
  31. }
  32.  
  33. // getting here means both numbers have the same prefix MSBs
  34. // need to compare first digit of smaller number with next
  35. // digit from larger:
  36.  
  37. int[] larger = i1 > i2 ? digits1 : digits2;
  38. int[] smaller = i1 > i2 ? digits2 : digits1;
  39.  
  40. for (int j = 0; i < larger.length && j < smaller.length; i++, j++) {
  41. if (larger[i] == smaller[j]) {
  42. continue;
  43. }
  44. return larger == digits2 ? larger[i] - smaller[j] : smaller[j] - larger[i];
  45. }
  46.  
  47. // this is a case like i1 = 123, i2 = 123123. In this case,
  48. // both numbers can be placed first:
  49. return 0;
  50. }
  51.  
  52. public static void main(String[] args) {
  53. Object[] arr = { 3, 34, 30 ,9 ,120, 345 , 345346 };
  54.  
  55. System.out.print("Largest concatenation of numbers is: ");
  56.  
  57. Arrays.stream(arr)
  58. .sorted(Sort::compareNumbers)
  59. .forEach(System.out::print);
  60.  
  61. System.out.println();
  62. }
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement