Android Joda Time,无法从ISOPeriodFormat中排序字符串

时间:2016-06-20 05:41:11

标签: java android sorting arraylist jodatime

我一直在寻找解决方案但无法找到有效的解决方案。

我有一个“记分牌”,需要显示应用程序使用Joda Time计算的最高“时间”(两个时刻之间的时间段)。

所有字符串都存储在ArrayList中,并通过ArrayAdapter和ListView显示。

问题:即使使用ISO格式,Collections.sort似乎也无法正常工作。

我正在使用以下格式节省时间:

PeriodFormatter formatter = ISOPeriodFormat.standard();

这给出了:“PT1M15.664S” (1分15秒)

我转换为字符串并存储到ArrayList中。

如何对这些字符串进行排序,使其在记分板中从最长到最短的时间内进行排序?

我尝试过自然分选和Alphanum Comparator没有运气。每次通过上限(分钟,小时,天)时,值都会如下:

"PT2.455S"
"PT1.324S"
"PT1M15.333S"

而不是我想要的:

"PT1M15.333S"
"PT2.455S"
"PT1.324S"

使用Collection.sort(myArrayList)也不起作用。

知道我应该做什么吗?

我的代码:

 // set is a set<String> retrieving it's values from a stringset scores saved
in the sharedpreferences of the app

 set = sharedPreferences.getStringSet("scores", null);

 //scores is the ArrayList
 scores.clear();


  if (set != null){

      scores.addAll(set);

  }else{

      scores.add("No Time Yet!");
      set = new LinkedHashSet<String>();
      set.addAll(scores);
      sharedPreferences.edit().putStringSet("scores",set).apply();
  }

//removing the String No Time Yet because it no longer serves a purpose here
  if ((set != null)&& (set.size()>1)){
      scores.remove("No Time Yet!");
  }


    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,scores);

listView.setAdapter(arrayAdapter);

Collections.sort(scores);

谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

简答:使用课程Duration,而不是Period

<强>解释

使用班级Period的一般方法是错误的。此类型表示各种数量单位对的元组。其中一些不可兑换或具有可比性。例如,无法确定P30D是大于还是等于或小于P1M(想想2月,4月或8月)。所以很明显为什么你不能按期间排序 resp。为什么这个类没有实现接口Comparable。此异议对于Period类型的对象以及其规范的ISO表示(作为String)有效。

但是因为你想要

  

最高&#34;次&#34; (两个时期之间的时期)

您可以使用Duration来确定两个给定时刻之间经过的秒数和毫秒数的绝对值。这种类型具有可比性,只有两个小的约束,这些约束对您来说可能并不重要:

  • 精度限制为毫秒
  • 忽略闰秒

我建议比较持续时间对象,而不是字符串,因为您需要按时间顺序排序,而不是字典顺序。因此,您可以使用Duration的字符串表示(如PT72.345S)进行存储,但需要对其进行解析以进行比较:

Instant i1 = new Instant(0);
Instant i2 = new Instant(72_345);
Duration d1 = new Duration(i1, i2);

Instant i3 = new Instant(60_000);
Instant i4 = new Instant(200_710);
Duration d2 = new Duration(i3, i4);

List<String> scoreTimes = new ArrayList<>();
scoreTimes.add(d1.toString());
scoreTimes.add(d2.toString());

// order from longest times to shortest times
Collections.sort(
    scoreTimes,
    new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            return Duration.parse(s2).compareTo(Duration.parse(s1));
        }
    }
);

System.out.println(scoreTimes); // [PT140.710S, PT72.345S]