JavaFX 8堆积条形图数字排序问题

时间:2017-06-07 17:37:41

标签: java sorting javafx

我正在开发一个解析文本文件的应用程序,并查找某些已发送操作之间的时间,简单的视觉辅助。

我的问题是StackedBarCharts x轴上的排序错误,如下面链接的图像所示;

Image of sorting issue

生成这些图表的相关代码;

public boolean updateBarChart(Tab t, DataHolder dock) {
    Node n = t.getContent();
    Node graph = n.lookup("#Graph");
    StackedBarChart bc = (StackedBarChart) graph;


    //Barchart
    NumberAxis xAxis = new NumberAxis();
    NumberAxis yAxis = new NumberAxis();
    bc.setTitle("Summary");
    bc.getData().clear();
    bc.setLegendVisible(true);
    bc.setCategoryGap(1);

    xAxis.setTickLabelRotation(90);

    ArrayList<String> tempArr = dock.getUniqueActionNumbers();

    for(String s : tempArr)
    {
        bc.getData().add(dock.calculateIntervalsBetweenActions(s));

    }

    bc.getXAxis().setAutoRanging(true);
    bc.getYAxis().setAutoRanging(true);

    return true;
}

生成该系列的代码,其中:

ConstantStrings是不断重新出现的字符串的ENUM,

PairValue是一个简单的家庭酿造配对,用于简单的本地缓存系统,所以每次我想要每个特定值的实例时,我都不会搜索整个数据结构。

public XYChart.Series<String, Number> calculateIntervalsBetweenActions(String actionNumber)
{
    XYChart.Series returnValue = new XYChart.Series();
    returnValue.setName(actionNumber);
    LocalTime lastTime = null;
    TreeMap<Integer, Integer> listOfNumbers = new TreeMap<Integer, Integer>();
    int maxVal = 0;

    ArrayList<PairValue> temp = metaMap.get(ConstantStrings.RECIEVED_ACTION_NUMBER);

    if (temp != null)
    {
        for( PairValue p : temp)
        {
            String s = dp.get(p.getNodePlace()).getTokens().get(p.getPointPlace()).getValue();
            if (!s.equals(actionNumber))
                continue;

            if(lastTime != null)
            {
                LocalTime tempTime = LocalTime.parse(dp.get(p.getNodePlace()).getTimestamp());
                int seconds = (int) lastTime.until(tempTime, SECONDS);
                if(seconds > maxVal) maxVal = seconds;

                Integer count = listOfNumbers.get(seconds);
                listOfNumbers.put(seconds, (count == null) ? 1 : count + 1);
                lastTime = tempTime;


            }
            else lastTime = LocalTime.parse(dp.get(p.getNodePlace()).getTimestamp());

        }
        //todo add filter so the user can choose what to ignore and not.
        for(int i = 2; i <= maxVal; i++) {
            Integer find = listOfNumbers.get(i);
            if(find != null) {

                XYChart.Data toAdd = new XYChart.Data(Integer.valueOf(i).toString(), find);
                returnValue.getData().add(toAdd);


            }

        }

    }
    else Logger.getGlobal().warning("Could not find meta map for Recieved action numer, aborting");

    return returnValue;
}

我的怀疑在于系列的添加顺序,但在我看来这不重要,所以我的问题就是这样;有没有简单的方法来正确排序这些值?

1 个答案:

答案 0 :(得分:0)

在大量敲打不理解之后找到了解决方案:

  • 首先,不要以编程方式跳过向原始系列添加任何值。添加要保留的值之间的所有0值。这是为了分类目的。
  • 在您完成添加新数据后删除所有0值。

这是我用来移除0值的代码片段,可以根据需要进行修改。

    ObservableList<XYChart.Series> xys = bc.getData();
    for(XYChart.Series<String,Number> series : xys) {
        ArrayList<XYChart.Data> removelist = new ArrayList<>();

        for(XYChart.Data<String,Number> data: series.getData()) {
            if(data.getYValue().equals(0)) removelist.add(data);
        }

        series.getData().removeAll(removelist);
    }