基于子字符串在Java中排序字符串

时间:2016-09-12 05:46:58

标签: java algorithm sorting comparator

我有一个字符串列表 def123,abc999,zzz000,abc123,zzz111 。 我希望列表排序,使前三个字符按升序排序,接下来三个按降序排序。 所以输出应该是 abc999,abc123,def123,zzz111,zzz000 这可能吗?

5 个答案:

答案 0 :(得分:7)

其他答案建议您实施list.sort(Comparator .comparing(s -> s.substring(0, 3)) .thenComparing(s -> s.subtring(3, 6), Comparator.reverseOrder())); 。 Java 8中的接口添加了最近的实用程序方法,不再需要这样做了:

List

另请注意,sort现在有{{1}}方法。

答案 1 :(得分:2)

是的,有可能。您必须自己编写Comparator。这是一个帮助您入门的教程https://www.tutorialspoint.com//java/java_using_comparator.htm

答案 2 :(得分:1)

将字符串分成两个子字符串,然后使用window.scrollY进行排序。这样的事情:Demo

comparator

答案 3 :(得分:0)

您应该创建一个自定义类,其中包含String作为属性。该类应该实现Comparable接口。

在自定义类中,您必须覆盖从compareTo(T o)接口继承的方法Comparable。你应该在那里应用你的排序逻辑。

然后,如果使用该自定义类作为对象类型创建Collection(例如:List<CustomClass>),则可以使用Collections.sort(list)方法对该List进行排序。

可以找到一个完整的示例here

答案 4 :(得分:-1)

如果您想要更多算法方法,请查看:https://jsfiddle.net/5adpqgrc/1/

// start with ['def123', 'abc999', 'zzz000', 'abc123', 'zzz111']
var strings = ['def123', 'abc999', 'zzz000', 'abc123', 'zzz111']
$('body').append(strings.join(' ') + '<br>')

// reverse the digits
// get this ['def876', 'abc000', 'zzz999', 'abc876', 'zzz888']
strings = reverse_digits_only(strings)
$('body').append(strings.join(' ') + '<br>')

// sort it
// get this ['abc000', 'abc876', 'def876', 'zzz888', 'zzz999']
strings = strings.sort()
$('body').append(strings.join(' ') + '<br>')

// reverse the digits again
// get this ['abc999' 'abc123' 'def123' 'zzz111' 'zzz000']
strings = reverse_digits_only(strings)
$('body').append(strings.join(' ') + '<br>')


function reverse_digits_only (strings) {
    return strings.map(function (string) {
        var first_three_letters = string.substring(0, 3)
        var reversed_digits = string.substring(3).split('').map(function (digit) {
            return 9 - digit
        })

        return first_three_letters + reversed_digits.join('')
    })
}

这是如何运作的:

  1. 反转数字(abc999变为abc000)
  2. 然后自然排序
  3. 然后再次反转数字。