java中结构化数据的比较

java中结构化数据的比较,java,tree,stack,comparison,structured-data,Java,Tree,Stack,Comparison,Structured Data,我已经成功地实现了一个java程序,它使用了两种常见的数据结构:一个树和一个堆栈,以及一个允许用户输入树节点ID并获取与其父节点相关的信息的界面。您可以在此处查看此程序的最新版本 背景 我编写的这个特别程序用于通过比较一个文件中的数据来研究数百种生物的基因流进化,该文件包括:FeatureId=字符串原语(进一步在第一列中列为“ATM-0000011”,“ATM-0000012”,等等),并由与它们在树中某个特定节点上的存在或不存在相关联的分数组成,这些分数是double原语 以下是数据文件的外

我已经成功地实现了一个java程序,它使用了两种常见的数据结构:一个
和一个
堆栈
,以及一个允许用户输入树节点ID并获取与其父节点相关的信息的界面。您可以在此处查看此程序的最新版本

背景

我编写的这个特别程序用于通过比较一个文件中的数据来研究数百种生物的基因流进化,该文件包括:FeatureId=
字符串
原语(进一步在第一列中列为
“ATM-0000011”
“ATM-0000012”
,等等),并由与它们在树中某个特定节点上的存在或不存在相关联的分数组成,这些分数是
double
原语

以下是数据文件的外观:

"FeatureID","112","115","120","119","124",...//this line has all tree node IDs
"ATM-0000011",2.213e-03,1.249e-03,7.8e-04,9.32e-04,1.472e-03,... //scores on these lines
"ATM-0000012",2.213e-03,1.249e-03,7.8e-04,9.32e-04,1.472e-03,...//correspond to node ID
"ATM-0000013",0.94,1.249e-03,7.8e-04,9.32e-04,1.472e-03,...//order in the first line
... //~30000 lines later
"ATM-0036186",0.94,0.96,0.97,0.95,0.95,...
问题

在此之前,只需从数据文件中创建一个双精度二维数组(该数组排除了文件中的第一行和FeatureId,因为它们是字符串),然后使用二维数组创建双精度堆栈就足够了。将根据用户输入和
确定父节点和子节点的堆栈

然后将同时弹出父堆栈和子堆栈中的数据(从而确保比较相同的FeatureId,而实际上不必将该数据包含在DS中),并根据它们是否满足定义的条件(即,如果两个值均大于等于0.75)对其值进行比较。如果他们这样做,计数器将递增。一旦比较完成(堆栈为空),程序将返回计数

现在我想做的不是仅仅计算,而是列出哪些FeatureId符合比较标准。因此,与返回表示节点A和节点B之间有4100个FeatureID满足条件的计数器不同,我想要一个在节点A和节点B之间比较的所有4100个FeatureID
字符串的列表。我稍后将该列表保存为文件,但这不关我的事。这意味着我可能不得不放弃以前工作得非常好的
double
2darray/
double
stack方案

问题


知道问题是什么,是否有一个聪明的解决方案,可以在不向流程添加更多数据的情况下更改输入数据文件或代码(tlacMain.java)中的某个位置?我只是需要一些想法。

我不确定我是否正确理解了您的问题,但您可以将当前比较的FeatureID添加到ArrayList中,然后将其写入文件,而不是增加计数器

如果每次比较都需要一个列表,可以使用类似于
HashMap
的内容

编辑:我阅读了您的评论,并试图在不做太多更改的情况下提出解决方案:

        String[] firstLine = sc.nextLine().split(regex);
        //line is the line of input being read in thru the inputFile
        int line = 0;
        //array of doubles will hold the data to be put in the stacks
        double [][] theData = new double [28420][firstLine.length];
        while(sc.hasNext())
        {
            String lineIn = sc.nextLine();
            String[] lineInAsString = lineIn.split(regex);
            for(int i = 1; i < lineInAsString.length; i++)
            {
                theData[line][i] = Double.parseDouble(lineInAsString[i]);
            }
            line++;
        }

        sc.close();

        return theData;
现在我们可以更改上面的代码以返回这两个值

    String[] firstLine = sc.nextLine().split(regex);
    // array of ids
    int[] featureIds = new int[firstLine.length];

    for(int i = 1; i < lineInAsString.length; i++)
    {
        featureIds[i] = Integer.parseInt(firstLine[i]);
    }

    // ... same stuff as before

    return new DataContainer(newMatrix, featureIds);
你可以写

DataContainer data = getFile(args);
double[][] newMatrix = data.matrix;
int[] featureIds = data.featureIds;
现在可以使用FeatureId数组将其与计算中的矩阵列相匹配。您可以为每个匹配创建
数组列表
添加(id)
,而不是在
内部增加
int
。然后返回
ArrayList
,以便在该函数之外使用它进行报告

ArrayList<Integer> addedFeatureIds = addedInternal(parentStackOne, childStackOne, featureIdStack);
ArrayList AddedFeatureId=addedInternal(parentStackOne、childStackOne、featureIdStack);

在计算FeatureID的地方,为什么不将它们添加到一个列表结构中,例如ArrayList?(这也适用于@felixbr)这种方法的问题是,用于比较的方法采用的是不包含FeatureID信息的类型的父堆栈和子堆栈。请参阅Github上我的代码中的实现
DataContainer data = getFile(args);
double[][] newMatrix = data.matrix;
int[] featureIds = data.featureIds;
ArrayList<Integer> addedFeatureIds = addedInternal(parentStackOne, childStackOne, featureIdStack);