【问题标题】:Getting the range of elements from a List in java从java中的List中获取元素范围
【发布时间】:2015-03-26 06:35:43
【问题描述】:

我有一个List<Float>,其中的元素按排序顺序排列。元素被添加到列表中,如下所示:

list.add(17.0);
list.add(19.0);
list.add(19.5);
list.add(20.0);
list.add(20.5);
list.add(23.0);
list.add(23.5);
list.add(34.0);
list.add(39.0);
list.add(39.5);

我想按顺序提取差异为 0.50 的元素作为范围。我需要将其转换为一个列表,其中包含“17.0”、“19.0-20.5”、“23-23.5”、“34”和“39-39.5”。我该怎么做?

【问题讨论】:

  • 第一个想法:使用地图。
  • 我认为你可以使用for 循环来做到这一点。

标签: java list sorting


【解决方案1】:

希望得到帮助:

List<Float> list = new ArrayList<Float>();
    list.add((float) 17.0);
    list.add((float) 19.0);
    list.add((float) 19.5);
    list.add((float) 20.0);
    list.add((float) 20.5);
    list.add((float) 23.0);
    list.add((float) 23.5);
    list.add((float) 34.0);
    list.add((float) 39.0);
    list.add((float) 39.5);

    List<String> retval = new ArrayList<String>();

    float sequenceBegin = list.get(0);
    float prev = list.get(0);
    for (int i = 1; i < list.size(); i++) {
        float d = list.get(i);
        if (d - prev != 0.5) {
            String seqStr = "";
            if (prev == sequenceBegin) {
                seqStr += prev; // sequence has only one item
            } else {
                seqStr += sequenceBegin + "-" + prev;
            }
            retval.add(seqStr);
            sequenceBegin = d;
        }
        prev = d;
    }

    //process the last item
    String seqStr = "";
    if (prev == sequenceBegin) {
        seqStr += prev; 
    } else {
        seqStr += sequenceBegin + "-" + prev;
    }
    retval.add(seqStr);     

    System.out.println(retval);




Output: [17.0, 19.0-20.5, 23.0-23.5, 34.0, 39.0-39.5]

【讨论】:

  • 谢谢安东尼...真的很有帮助。
  • 顺便说一句,我还没有检查重复项目的情况(即有超过 1 个项目 17.0)。您可以对其进行优化以使您的代码更可靠。
  • 浮点精度陪你玩游戏。将一个浮点数与另一个浮点数进行比较几乎总是有问题的。当你的价值观增长时,这可能会发生:System.out.println(9999999.5f - 9999999.0f); // 1.0 System.out.println(1.5f - 1.0f); // 0.5
  • @Anthony .....对我来说,当我从 Set 填充列表时,它永远不会有重复的元素所以你的代码对我来说已经足够好了,我已经对答案投了赞成票。非常感谢。
【解决方案2】:

试试下面的例子:

    // TODO Auto-generated method stub
    List<Float> list = new ArrayList<Float>();
    list.add((float) 17.0);
    list.add((float) 19.0);
    list.add((float) 19.5);
    list.add((float) 20.0);
    list.add((float) 20.5);
    list.add((float) 23.0);
    list.add((float) 23.5);
    list.add((float) 34.0);
    list.add((float) 39.0);
    list.add((float) 39.5);

    List<List<Float>> listTmp = new ArrayList<List<Float>>();       
    List<Float> iList = null;

    for(int i = 0; i < list.size(); i++){
        if(iList == null) {
            iList = new ArrayList<Float>();
            iList.add(list.get(i));
        }
        else {
            if(list.get(i) - iList.get(iList.size() - 1) == 0.5){
                iList.add(list.get(i));
                if(i == list.size() - 1){
                    listTmp.add(iList);
                }
            }
            else {
                listTmp.add(iList);
                iList = null;
                i--;
            }
        }
    }

    List<String> finalList = new ArrayList<String>();

    for(int i = 0; i < listTmp.size(); i++){
        List<Float> iiList = listTmp.get(i);
        if(iiList.size() == 1){
            finalList.add(String.valueOf(iiList.get(0)));
        }
        else {
            finalList.add(String.valueOf(iiList.get(0)) + "-" + String.valueOf(iiList.get(iiList.size() - 1)));
        }           
    }


    System.out.println(finalList);

希望对您有所帮助!

【讨论】:

  • 嗨,南,这看起来不错,但它仍然没有打印 39 到 39.5 的最后一个范围。
  • 我会非常小心地假设像这样比较浮点数是 100% 准确的
  • 我只是稍微修改一下以获得完整的结果!请尽情享受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
相关资源
最近更新 更多