[英]Sorting alphanumeric strings java
I have this array storing the suffix of some URLs the user is adding: 我有这个数组存储用户添加的一些URL的后缀:
[U2, U3, U1, U5, U8, U4, U7, U6]
When I do this: 当我这样做:
for (Map<String, String> map : getUrlAttachments()) {
String tmpId = map.get("id"); //it receives the U2, in the 1st iteration, then U3, then U1,...
if (tmpId.charAt(0) == 'U') {
tmpId.charAt(1);//2, then 3, then 1,...
String url = map.get("url");
String description = map.get("description");
URLAttachment attachment;
String cleanup = map.get("cleanup");
if (cleanup == null && url != null && description != null) {
attachment = new URLAttachmentImpl();
attachment.setOwnerClass(FileUploadOwnerClass.Event.toString());
attachment.setUrl(url);
attachment.setDescription(description);
attachment.setOwnerId(auctionHeaderID);
attachment.setUrlAttachmentType(URLAttachmentTypeEnum.EVENT_ATTACHMENT);
attachment.setDateAdded(new Date());
urlBPO.save(attachment);
}
My problem: 我的问题:
I want to change this For
condition by passing another list mapping the data sorted like [U1, U2, U3, U4, U5, U6, U7, U8]
. 我想通过传递另一个列表来改变这个
For
条件,这些列表映射了像[U1, U2, U3, U4, U5, U6, U7, U8]
那样排序的数据。
I'd like your help to know what's the best way I could do this. 我希望你的帮助能够知道我能做到这一点的最佳方式。
I thought about creating an array listing the ids and then sort then, but I don't know how exactly to sort alphanumeric strings in java. 我想创建一个列出id的数组然后排序,但我不知道如何在java中对字母数字字符串进行排序。
Just use Collections.sort()
method after creating an ArrayList
of your values like this: 在创建值的
ArrayList
之后,只需使用Collections.sort()
方法,如下所示:
ArrayList<String> a = new ArrayList<String>();
a.add("U2");
a.add("U1");
a.add("U5");
a.add("U4");
a.add("U3");
System.out.println("Before : "+a);
Collections.sort(a);
System.out.println("After : "+a);
Output : 输出:
Before : [U2, U1, U5, U4, U3]
After : [U1, U2, U3, U4, U5]
I decide to use the idea @Abu gave, but I adapted it: 我决定使用@Abu给出的想法,但我改编了它:
ArrayList
to store the numerical part of each id. ArrayList
来存储每个id的数字部分。 I sort this ArrayList
like @Abu taught me in his answer and then I verify for each id in this sorted ArrayList
in the sequence it should be added.. 我将这个
ArrayList
排序为像@Abu一样在他的答案中教我,然后我按照它应该添加的顺序验证这个排序的ArrayList
中的每个id。
ArrayList <Integer> urlSorted = new ArrayList<Integer>(); //sort the url ids for (Map<String, String> map : getUrlAttachments()) { String tmpId = map.get("id"); if (tmpId.charAt(0) == 'U') { //gets the id, removing the prefix 'U' urlSorted.add( Integer.valueOf(tmpId.substring(1))); } } //sort the urlIds to check the sequence they must be added Collections.sort(urlSorted); //checks for each url id, compares if it's on the natural order of sorting to be added. for(Integer urlId: urlSorted) { for (Map<String, String> map : getUrlAttachments()) { String sortedId = "U"+urlId; String tmpId = map.get("id"); //compare the ids to add the 1, then 2, then 3... if (map.get("id").equals(sortedId)) { //code to save according to the sorted ids. } } }
Create a custom Comparator<Map<String,String>>
: 创建自定义
Comparator<Map<String,String>>
:
public class IdComparator implements Comparator<Map<String,String>> {
public int compare(Map<String,String> left, Map<String,String> right) {
return orderKey(left).compareTo(orderKey(right));
}
static Integer orderKey(Map<String,String> m) {
return Integer.parseInt(m.get("id").substring(1));
}
}
and then use Arrays.sort(urlAttachments, new IdComparator());
然后使用
Arrays.sort(urlAttachments, new IdComparator());
prior to iterating over it. 在迭代它之前。 Depending on details, you may push this sorting logic into
getUrlAttachments()
and keep the code you have posted exactly as it is now. 根据细节,您可以将此排序逻辑推送到
getUrlAttachments()
并保持您已经发布的代码与现在完全相同。
I think what you are asking is similar to this one : 我想你所问的与这个类似:
http://www.davekoelle.com/alphanum.html http://www.davekoelle.com/alphanum.html
You can break string into pure string and numeric string. 您可以将字符串分解为纯字符串和数字字符串。 for eg: abc123 would be split into "abc" and "123" You can compare alphabetic string with normal comparison and then to sort "123" such kind of strings, you have two options: 1: Convert it into Integer and then compare 2: If number does not fit in Integer range, you can compare letter by letter.
例如:abc123将分为“abc”和“123”您可以将字母字符串与正常比较进行比较,然后对“123”这类字符串进行排序,您有两种选择:1:将其转换为整数然后比较2 :如果数字不适合整数范围,您可以逐字母进行比较。
for eg "123" vs "133" compare "1" and "1" = equal Compare "2" and "3" = greater so "123" < "133". 例如“123”vs“133”比较“1”和“1”=等于比较“2”和“3”=更大使得“123”<“133”。
Option 2 is more accurate and less error proof. 选项2更准确,更少的错误证明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.