如何对字符串列表进行排序由Java中的数字和字母组成?

Alm*_*ett 5 java sorting string algorithm

我有一个项目列表,包括数字和字母,如下所示:

原始清单:

Apple 1
Apple 1
Apple 4
Apple 1A
Apple 1B
Apple 1D
Apple 2A
Apple 2A
Apple 1C
Apple 1B
Apple 2C
Apple 10
Apple 11
Apple 5
Apple 11
Apple 8D
Banana 1
Banana 4
Banana 9D
Banana 9E
Banana 9C
Banana 13
Banana 16
Run Code Online (Sandbox Code Playgroud)

这是从API搜索结果,只能通过字母顺序进行排序ApplesBananas.现在我想用数字(数字随机带字母A,B,C,D,E)对它进行排序,如下所示:

带有A,B,C,D,E字母的数字应按数字和字母顺序排序.

预期清单:

Apple 1
Apple 1
Apple 1A
Apple 1B
Apple 1B
Apple 1C
Apple 1D
Apple 2
Apple 2A
Apple 2A
Apple 2C
Apple 4
Apple 5
Apple 8D
Apple 10
Apple 11
Banana 1
Banana 4
Banana 9C
Banana 9D
Banana 9E
Banana 13
Banana 16
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个解决方案,但它按照0-9位开头按照下面的顺序命令所有项目:

private List<Location> sortLocationList(List<Location> locationArrayList){
  Collections.sort(locationArrayList, new Comparator<Location>(){
    @Override
    public int compare(Location o1, Location o2){
      return o1.getValue().compareToIgnoreCase(o2.getValue());
    }
  });
  return locationArrayList;
}

public class Location{

  public enum LocationType{ADDRESS, STREET, CITY}

  private JavascriptObject object;
  private LocationType locationType;
  private String value;

  public Location(LocationType locationType, String value, JavascriptObject object){
    this.locationType = locationType;
    this.value = value;
    this.object = object;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的解决方案是返回:

Apple 1
Apple 1
Apple 10
Apple 11
Apple 1A
Apple 1B
Apple 1B
Apple 1C
Apple 1D
Apple 2
Apple 2A
Apple 2A
Apple 2C
Apple 4
Apple 5
Apple 8D
Banana 1
Banana 13
Banana 16
Banana 4
Banana 9C
Banana 9D
Banana 9E
Run Code Online (Sandbox Code Playgroud)

有没有更好的解决方案来排序此列表

提前致谢.

for*_*pas 5

我假设总会有这样的模式:

"something something"
Run Code Online (Sandbox Code Playgroud)

对于该getValue()方法返回的所有值,
并且第二个值"something"始终以带有或不带有尾随字符的数字开头。
下面的代码将每个这样的值分成 3 部分,并按
字母顺序比较第 1 部分,按
数字顺序比较第 2 部分,按字母顺序比较
3d 部分:

private List<Location> sortLocationList(List<Location> locationArrayList){
    Collections.sort(locationArrayList, new Comparator<Location>(){
        @Override
        public int compare(Location o1, Location o2){
            String s1 = o1.getValue();
            String s2 = o2.getValue();

            if (s1.equalsIgnoreCase(s2))
                return 0;

            String[] tokens1 = s1.split(" ");
            String[] tokens2 = s2.split(" ");

            if (!tokens1[0].equalsIgnoreCase(tokens2[0]))
                return s1.compareToIgnoreCase(s2);

            int number1 = Integer.parseInt(tokens1[1].replaceAll("\\D", ""));
            int number2 = Integer.parseInt(tokens2[1].replaceAll("\\D", ""));

            if (number1 != number2)
                return number1 - number2;

            String suffix1 = tokens1[1].replaceAll("\\d", "");
            String suffix2 = tokens2[1].replaceAll("\\d", "");

            return suffix1.compareToIgnoreCase(suffix2);
        }
    });

    return locationArrayList;
}
Run Code Online (Sandbox Code Playgroud)