Java 查找数组中给出最大数字的数字顺序

Java 查找数组中给出最大数字的数字顺序,java,arrays,algorithm,Java,Arrays,Algorithm,假设我有一个数组: int[] arr = {23, 4, 46, 720, 56}; 我怎样才能找到给出最大数的数字顺序 例如,在数组arr中,顺序为 7205646423 编辑:也可以有n位数字,即不一定限于3位 例如 答案是 97726423223 词典分类是一个良好的开端 然而,当考虑到例如,[854845854855]需要排序为[854855854853]时,困难就来了 解决这一问题的一种方法是定义一个比较器,比较串联版本的数字(即比较abc和def转换为比较abcdef和def

假设我有一个数组:

int[] arr = {23, 4, 46, 720, 56};
我怎样才能找到给出最大数的数字顺序

例如,在数组arr中,顺序为

7205646423
编辑:也可以有n位数字,即不一定限于3位

例如

答案是

97726423223

词典分类是一个良好的开端

然而,当考虑到例如,
[854845854855]
需要排序为
[854855854853]
时,困难就来了

解决这一问题的一种方法是定义一个比较器,比较串联版本的数字(即比较
abc
def
转换为比较
abcdef
defabc

最简单的版本:

// processing numbers as strings
List<String> array = Arrays.asList("854", "854853", "854855");
Collections.sort(array, new Comparator<String>() {
   @Override
   public int compare(String o1, String o2)
   {
      // negative since we want biggest first
      return -(o1+o2).compareTo(o2+o1);
   }
});


我最初有一个更复杂的版本,理论上应该更快一点,因为它有几个for循环,将索引环绕到另一个数组中,而不是一个循环,检查长度,但是简单性在这里胜过了我的性能差异。如果您感兴趣,可以随时查看post history(),但请注意,该版本中有一个bug-在最后一个循环之后,其他索引应该封装到其他数组中。

字典排序是一个良好的开始

然而,当考虑到例如,
[854845854855]
需要排序为
[854855854853]
时,困难就来了

解决这一问题的一种方法是定义一个比较器,比较串联版本的数字(即比较
abc
def
转换为比较
abcdef
defabc

最简单的版本:

// processing numbers as strings
List<String> array = Arrays.asList("854", "854853", "854855");
Collections.sort(array, new Comparator<String>() {
   @Override
   public int compare(String o1, String o2)
   {
      // negative since we want biggest first
      return -(o1+o2).compareTo(o2+o1);
   }
});


我最初有一个更复杂的版本,理论上应该更快一点,因为它有几个for循环,将索引环绕到另一个数组中,而不是一个循环,检查长度,但是简单性在这里胜过了我的性能差异。如果您感兴趣,可以随时查看post history(),但请注意,该版本中有一个bug-在最后一个循环之后,其他索引应该封装到其他数组中。

Just(string)-对数字排序,然后连接。7205646423是最大的iguess@nhahtdh对的更有趣的例子是
72
720
,其中
72
应该放在第一位。@nhahtdh您是对的。Just(string)的可能重复-对数字排序,然后连接。7205646423是最大的guess@nhahtdh对的更有趣的例子是
72
720
,其中
72
应该放在第一位。@nhahdh您是对的。第二种方法的可能重复对于这个测试用例来说似乎是错误的:
725627256725627256273 7272727272727272727272727
,727应该放在72之前。这是从stdin获取输入的修改程序:@nhahdh Fixed。嗯,重写了。就地比较方法是干净的,比我的旧代码更容易理解。第二种方法对于这个测试用例似乎是错误的:
72562 725627256273 72727 727 727 727应该在72之前。这是从stdin获取输入的修改程序:@nhahdh Fixed。嗯,重写了。就地比较方法是干净的,比我的旧代码更容易理解。
@Override
public int compare(String s1, String s2)
{
   int i;
   int length = s1.length() + s2.length();
   for (i = 0; i < length; i++)
   {
      char c1 = get(s1, s2, i),
           c2 = get(s2, s1, i);
      if (c1 != c2)
      {
         return (c1 > c2 ? -1 : 1);
      }
   }
   return 0;
}

private char get(String s1, String s2, int index)
{
   if (index < s1.length())
      return s1.charAt(index);
   else
      return s2.charAt(index - s1.length());
}