比较和排序Java字符串

时间:2019-04-21 20:58:22

标签: java compare

我有字符串数组:15MB,12MB,1TB,1GB。我想按字母顺序按MB小于GB和TB的规则对它们进行比较。 所以最后我想得到:12MB,15MB,1GB,1TB。我找到了一种比较字母的方法:

 final static String ORDER="MGT";

public int compare(String o1, String o2) {
       int pos1 = 0;
       int pos2 = 0;
       for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) {
          pos1 = ORDER.indexOf(o1.charAt(i));
          pos2 = ORDER.indexOf(o2.charAt(i));
       }

       if (pos1 == pos2 && o1.length() != o2.length()) {
           return o1.length() - o2.length();
       }

       return pos1  - pos2  ;
    }

我正在考虑按数字和字母分割字符串,然后如何按其字母“ MB ..”然后按其数字对其进行排序。我要使用两个比较器还是其他?

3 个答案:

答案 0 :(得分:1)

如果您首先将数据转换为通用单位(例如MB),则比较起来会容易得多。如果此转换后的值相同,则应应用字典顺序排序,如下所示:

4
a
b
c

答案 1 :(得分:0)

这可以解决问题。 compare方法获取每个String表示的长字节数(10KB变为10000),然后进行比较。 getSizeOfString方法将一个String转换成一个long,该long表示它所代表的字节数。

  public int compare(String o1, String o2) {
    long size1 = getSizeOfString(o1);
    long size2 = getSizeOfString(o2);
    return Long.compare(size1, size2);
  }

  private long getSizeOfString(String sizeString) {
    Pattern validSizePattern = Pattern.compile("(\\d+)([KMG])B");
    Matcher matcher = validSizePattern.matcher(sizeString);
    matcher.find();
    long size = Long.valueOf(matcher.group(1));

    switch (matcher.group(2)) {
      case "K":
        size *= 1024;
        break;
      case "M":
        size *= (1024 * 1024);
        break;
      case "G":
        size *= (1024 * 1024 * 1024);
        break;
    }
    return size;
  }

答案 2 :(得分:0)

现在这将首先对单位进行排序,然后对单位内的值进行排序。更改此内容以反映OP的最新评论。

import java.util.*;

enum Memory {
   B(1), KB(2), MB(3), GB(4), TB(5);
   public long val;

   private Memory(long val) {
      this.val = val;
   }
}

public class MemorySort {
   public static void main(String[] args) {
      List<String> memory = Arrays.asList("122003B",
            "1TB",
            "2KB",
            "100000MB",
            "1027MB",
            "2024GB");

      Comparator<String> units = Comparator.comparing(
            a -> Memory.valueOf(a.replaceAll("\\d+", "")).val);

      Comparator<String> values = Comparator.comparing(
            a -> Integer.parseInt(a.replaceAll("[A-Z]+", "")));

      Collections.sort(memory, units.thenComparing(values));
      System.out.println(memory);
   }
}