简体   繁体   English

排序字母数字字符串java

[英]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给出的想法,但我改编了它:

  1. I check the ids of the urls the user is trying to add, 我检查用户试图添加的网址的ID,
  2. I remove the alphabetic suffix in this id and then I create an ArrayList to store the numerical part of each id. 我删除了此id中的字母后缀,然后创建一个ArrayList来存储每个id的数字部分。
  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM