【问题标题】:How to sort a string array in ascending order according to a particular unit?如何根据特定单元对字符串数组进行升序排序?
【发布时间】:2019-03-07 16:11:25
【问题描述】:
String[] stringArray = {"1 kbps", "100 bps", "10 mbps", "2 gbps"};

需要的输出

{ "100 bps","1 kbps", "10 mbps", "2 gbps"}

升序

【问题讨论】:

  • 最好自己写Comparator。然后你可以将它的一个实例传递给Arrays.sort()
  • 反序列化这些值,换句话说,将这些字符串解析为更有用的格式。 "1 kbps" 是一个很好的人类可读值,但是当您需要以任何方式处理它时,整数 1000(或者是 1024?)会更有用

标签: java string sorting


【解决方案1】:

像这样使用比较器:

String[] stringArray = {"1 kbps", "100 bps", "10 mbps", "2 gbps"};
Arrays.sort(stringArray, new SpeedComparator());
System.out.println(Arrays.asList(stringArray));
// [100 bps, 1 kbps, 10 mbps, 2 gbps]
import java.util.Comparator;

public class SpeedComparator implements Comparator<String> {

  public int compare(String o1, String o2) {

    int indexSeparator1 = o1.indexOf(' ');
    int indexSeparator2 = o2.indexOf(' ');
    String number1 = o1.substring(0, indexSeparator1);
    String number2 = o2.substring(0, indexSeparator2);

    double value1 = Double.valueOf(number1);
    double value2 = Double.valueOf(number2);

    String measure1 = o1.substring(indexSeparator1 + 1, o1.length());
    String measure2 = o2.substring(indexSeparator2 + 1, o2.length());

    value1 = getRealValue(value1, measure1);
    value2 = getRealValue(value2, measure2);

    return (int) (value1 - value2);

  }

  private double getRealValue(double value, String measure) {
    switch (Measure.valueOf(measure.toUpperCase())) {
      case BPS:
        return value;
      case KBPS:
        return value * 1000;
      case MBPS:
        return value * 1000000;
      case GBPS:
        return value * 1000000000;
    }
    return value;
  }

  enum Measure {
    BPS, KBPS, MBPS, GBPS
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2013-04-23
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    相关资源
    最近更新 更多