java数字字符串排序函数,Java带数字的排序算法字符串

I have a List of Strings. EXAMPLE_1, EXAMPLE_2, EXAMPLE_3 ... EXAMPLE_99

What is the best algorithm for sorting here?

Is it possible with a Collator?

This is my current procedure, but I guess there could be a better way:

public class Example implements Comparable {

private final String id;

public getId() {

return id;

}

private Integer getIdNo() {

try {

return Integer.parseInt(getId().replaceAll("[\\D]", ""));

} catch (NumberFormatException e) {

return null;

}

}

@Override

public int compareTo(Example o) {

if ((getIdNo() == null && getIdNo() != null) || (getProductFeatureId_sizeNo() < o.getProductFeatureId_sizeNo())) {

return -1;

} else if (o.getIdNo() == null || getIdNo() > o.getIdNo()) {

return 1;

}

return 0;

}

}

解决方案

This is better alternative - AlphanumComparator.java

Copying the code for ready reference -

public class AlphanumComparator implements Comparator

{

private final boolean isDigit(char ch)

{

return ch >= 48 && ch <= 57;

}

/** Length of string is passed in for improved efficiency (only need to calculate it once) **/

private final String getChunk(String s, int slength, int marker)

{

StringBuilder chunk = new StringBuilder();

char c = s.charAt(marker);

chunk.append(c);

marker++;

if (isDigit(c))

{

while (marker < slength)

{

c = s.charAt(marker);

if (!isDigit(c))

break;

chunk.append(c);

marker++;

}

} else

{

while (marker < slength)

{

c = s.charAt(marker);

if (isDigit(c))

break;

chunk.append(c);

marker++;

}

}

return chunk.toString();

}

public int compare(Object o1, Object o2)

{

if (!(o1 instanceof String) || !(o2 instanceof String))

{

return 0;

}

String s1 = (String)o1;

String s2 = (String)o2;

int thisMarker = 0;

int thatMarker = 0;

int s1Length = s1.length();

int s2Length = s2.length();

while (thisMarker < s1Length && thatMarker < s2Length)

{

String thisChunk = getChunk(s1, s1Length, thisMarker);

thisMarker += thisChunk.length();

String thatChunk = getChunk(s2, s2Length, thatMarker);

thatMarker += thatChunk.length();

// If both chunks contain numeric characters, sort them numerically

int result = 0;

if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0)))

{

// Simple chunk comparison by length.

int thisChunkLength = thisChunk.length();

result = thisChunkLength - thatChunk.length();

// If equal, the first different number counts

if (result == 0)

{

for (int i = 0; i < thisChunkLength; i++)

{

result = thisChunk.charAt(i) - thatChunk.charAt(i);

if (result != 0)

{

return result;

}

}

}

} else

{

result = thisChunk.compareTo(thatChunk);

}

if (result != 0)

return result;

}

return s1Length - s2Length;

}

}

Note: you should generify this class if you're using java 1.5+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值