以相同方式对2个数组排序

时间:2019-01-30 18:55:12

标签: processing

我有两个未排序的数组:浮点数组(float[])和 String 数组(String[])进行描述。

我需要将浮点数组从最高值到最低值进行排序,但是描述在 String 数组中,如果我将其排序,则字符串数组不会相应地排序。

处理中,有一个sort(Array)函数,但只对一个数组排序。

如何对float数组进行排序并使描述匹配?

float totalCount = 0;
float maxValue = 0;
String[] statusDescriptions = new String[finishStatusesJSON.size()];
float[] countData = new float[finishStatusesJSON.size()]; 
for (int i = 0; i < finishStatusesJSON.size(); i++) {
  JSONObject finishStatusJSON = (JSONObject) finishStatusesJSON.get(i);
  float count = finishStatusJSON.getFloat("count"); 
  String status = finishStatusJSON.getString("status");
  totalCount += count;
  statusDescriptions[i] = status;
  countData[i] = count;

  // Max value of the table
  if(maxValue < count) maxValue = count;

}

3 个答案:

答案 0 :(得分:1)

一种解决方案是创建一个包含您的条目的类,即,将浮点数与其说明结合在一起。例如,如果将电影存储为字符串,并将其乐谱存储为浮点数,则可以创建一个类<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> <svg width="2000" height="2000" xmlns="http://www.w3.org/2000/svg"> <defs> <marker id="arrowLeft" viewBox="0 0 20 20" refX="0" refY="10" markerUnits="userSpaceOnUse" orient="170" markerWidth="20" markerHeight="20"> <polyline id="markerPoly1" points="0,0 20,10 0,20 2,10" fill="#4caf50" /> </marker> <marker id="arrowRight" viewBox="0 0 20 20" refX="0" refY="10" markerUnits="userSpaceOnUse" orient="auto" markerWidth="20" markerHeight="20"> <polyline id="markerPoly1" points="0,0 20,10 0,20 2,10" fill="#4caf50" /> </marker> <marker id="circle1" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="userSpaceOnUse" orient="auto" markerWidth="10" markerHeight="10"> <circle cx="5" cy="5" r="5" fill="#4caf50" /> </marker> </defs> <path id="path1" fill="none" stroke="#4caf50" stroke-width="2" stroke-miterlimit="10" d="M195.2,75.3c28-11.5,60.9-18.1,96-18.1 c78.4,0,145.6,32.9,173.1,79.4" style=" marker-end: url(#arrowRight); marker-start: url(#circle1); fill:none; stroke:green; stroke-width:2; " /> <g transform="translate(0 100)" > <path id="path1" fill="none" stroke="#4caf50" stroke-width="2" stroke-miterlimit="10" d="M195.2,75.3c28-11.5,60.9-18.1,96-18.1 c78.4,0,145.6,32.9,173.1,79.4" style=" marker-end: url(#circle1); marker-start: url(#arrowLeft); fill:none; stroke:green; stroke-width:2; " /> </g> </svg>,其中包含电影描述(字符串)及其乐谱(浮点数)。您可以使此类MovieScore,然后对Comparable的数组进行排序以实现您的目标。

答案 1 :(得分:1)

如何使用一个简单的类来保存这两个数据并将它们保存在一个数组中,以便于排序。通过实现Comparable协议来支持排序。

class Status implements Comparable<Status> {
    String  status;
    float count;

    public Status(String status, float count) {
        this.status = status;
        this.count = count;
    }

    @Override
    public int compareTo(Status s) {        
        if (this.count < s.count) {
            return 1;
        } else if (this.count > s.count) {
            return -1;
        }

        return 0;
    }
}

Status[] statusArray = new Status[finishStatusesJSON.size()];

for (int i = 0; i < finishStatusesJSON.size(); i++) {
    JSONObject finishStatusJSON = (JSONObject) finishStatusesJSON.get(i);
    Status status = new Status(finishStatusJSON.getString("status"), finishStatusJSON.getFloat("count")); 

    statusArray[i] = status;
}

Arrays.sort(statusArray);

答案 2 :(得分:1)

也许您可以使用Map<K,V>类型的数组,其中K将是Float类,而V将是String

因此,您可以使用put(K,V)方法,如下所示,然后正确排序。

float count = finishStatusJSON.getFloat("count");
totalCount += count;

map.put( count, finishStatusJSON.getString("status") );

尽管,看来您在谈论处理而不是Java。


勘误表:最好使用SortedMap实现类;因为您可以直接将Comparator放入构造函数中,也可以使用自然顺序,因此 Map 会对其进行排序。

如果您仍然想使用 Map 实现类,那么我建议您使用 Map keySet()方法,然后采用与this answer中建议。

但是,我对在Processing中使用这些类表示怀疑,因为它实际上对其框架无效;但是,如果它可以编译并且没有执行错误/异常,那么可能值得尝试。