大家好:我现在写一个东西,遇到一个问题大致如此:1。 我有一个txt 日志文档, 我将日志按行读取存于arrayList.其中 每条list中 我需要用到的是 命令command 和 起始时间。用于绘图。       2。 绘图是 甘特图:即, 左边Y轴显示 所有的命令, 右边显示每条命令起始的时间和结束时间的过程 比如以一个方框来绘图,没有出现此命令时是横线        3. 我绘图使用jfreechart. 其中,我需要将每条命令添加于一个 series.  我用了一个 series 的数组来存储不同的命令线条。 比如: 命令:terminal 是series[1] ,再在series[1】中加入任务task(命令,命令起始时间,命令结束时间)。
 问题所在,在于动态匹配,希望我讲清楚了,如果有没说好的地方请大家提出,并给我帮助,非常感谢。
private IntervalCategoryDataset createDataset() { this.flags = modelfocus.getListflag();// 为了匹配每个命令,我在写入一个命令时,也写入一个标记用来找相应的命令 commands = modelfocus.getListCommand();//获得所有命令

DateFormat formatedate = new SimpleDateFormat("yyyy/MM/ww/dd HH:mm:ss"); cal = Calendar.getInstance(); nextDate = modelfocus.getNextDate();//获得一条命令的结束、(即下一命令的开始) //初始化命令个数 个线条 用来绘图
for (int i = 0; i < countCom; i++) {
this.series[i] = new TaskSeries(commands.get(i));
} int flag = 0;
Task task; //任务,用于 new task(命令,开始时间,结束时间) //遍历日志文件list
for (Focus listTxt : modelfocus.getList()) { 
try { d1 = formatedate.parse(listTxt.date2String()); // postcal.setTime();
} catch (ParseException e) {
System.out.println("Can't change this date");
e.printStackTrace();
}
d1 = modelfocus.getDate().get(flag);
cal.setTime(d1);
System.out.println(cal); if (flag < nextDate.size() - 1) {
d2 = nextDate.get(flag);
System.out.println("start:......" + d1);
System.out.println("e n d:......" + d2);
} String eachCmd = listTxt.getCommand();//获取当前日志行的命令段
//问题的地方(我觉得是这里)
//我循环所有命令,判断是否和当前命令匹配,如果匹配的话就加入相应命令的 线条

for (int i = 0; i < countCom; i++) {

String currentCmd = listTxt.getCommand();

if (eachCmd==currentCmd && currentCmd !=" ") {

if (d1.compareTo(d2) < 0)
task = new Task(currentCmd, d1, d2);
else {
System.out.println(cal);
task = new Task(currentCmd, d1, d1);
}
//任务加入线条
series[i].add(task);
}
} flag++;
} TaskSeriesCollection dataset = new TaskSeriesCollection();
        //任务集合
for (int i = 0; i < countCom; i++) {
dataset.add(this.series[i]);
} return dataset;
}附:有问题的图表
算法java

解决方案 »

  1.   

    从代码来看,eachCmd 和 currentCmd是始终相等的 (两者都是通过listTxt.getCommand()来获得的)
    这大概是问题所在吧。另外,LZ的jdk是不是1.6或以上的版本的?居然是直接用==来判断字符串是否相同...
      

  2.   


    恩,对。我吧一个加入线条的循环写在函数体里面了,所以它一直会在一个循环里画,我用==是最开始写的时候,只用了一个命令当时,图简单,后面就忘了改了是 equals。 我帖出现在的代码,是正确的,谢谢你啊private IntervalCategoryDataset createDataset() { this.flags = modelfocus.getListflag();// 为了匹配每个命令,我在写入一个命令时,也写入一个标记用来找相应的命令 commands = modelfocus.getListCommand();// 获得所有命令 DateFormat formatedate = new SimpleDateFormat("yyyy/MM/ww/dd HH:mm:ss");
    cal = Calendar.getInstance();
    nextDate = modelfocus.getNextDate();
    dstart = modelfocus.getDate().get(0);
    dend = modelfocus.getDate().get(modelfocus.getList().size() - 1); Task task[] = new Task[commands.size()];
    // 初始化命令个数 个线条 用来绘图 for (int i = 0; i < countCom; i++) {
    this.series[i] = new TaskSeries(commands.get(i).getName());
    task[i] = new Task(commands.get(i).getName(), dstart, dend);
     Task(modelfocus.getListCommand().get(i).getName(),dstart,dend);
    } int flag = 0; // 遍历日志文件list for (Focus listTxt : modelfocus.getList()) {
    d1 = modelfocus.getDate().get(flag);
    cal.setTime(d1); System.out.println(cal);
    System.out.println(flag + "      i m flag"); if (flag < nextDate.size()) {
    d2 = nextDate.get(flag);
    System.out.println(flag + "i m flag");
    System.out.println("start:......" + d1);
    System.out.println("e n d:......" + d2);
    }
    String currentCmd = listTxt.getCommand(); for (int i = 0; i < countCom && (currentCmd != null); i++) { String eachCmd = modelfocus.getListCommand().get(i).getName();
    int numEachCmd = modelfocus.getListCommand().get(i).getNum(); System.out.println(countCom);
    System.out.println(currentCmd + "   cunnrent");
    System.out.println(eachCmd + "    each"); // if (eachCmd != null) {
    // System.out.println(eachCmd.getNum());
    // }
    // if ((eachCmd != null) && (eachCmd.getNum() < 10)) {
    if (eachCmd != null) { int subflagv;
    System.out.println(d1 + "--------------------");
    System.out.println(d2 + "--------------------"); // problem!!!!!!!!!!!!!!!
    if (currentCmd.equals(eachCmd)) {
    System.out
    .println("testttttttttttttttttttttttttttttttttttt");
    if (d1.compareTo(d2) < 0) {
    subflagv = 0;
    task[numEachCmd].addSubtask(new Task(
    (currentCmd + Integer.toString(subflagv)),
    d1, d2));
    subflagv++;
    } else {
    System.out.println(cal);
    int subflagf = 0;
    task[numEachCmd].addSubtask(new Task(
    (currentCmd + Integer.toString(subflagf)),
    d1, d1));
    subflagf++;
    }
    }
    }
    // if(eachCmd.getNum() == 0)
    // System.out.println("qwe");
    // 任务加入线条 }
    flag++;
    }
    TaskSeriesCollection dataset = new TaskSeriesCollection();
    // 任务集合 for (int i = 0; i < countCom; i++) {
    dataset.add(series[i]);
    }
    return dataset;
    }