Ale*_*bin 5 java tree comparison stack structured-data
我已成功实现了一个使用两种常见数据结构的java程序:a Tree和a Stack以及允许用户输入树节点ID并获取与其父节点相关的信息的接口.您可以在我的GitHub src上查看此程序的最新版本
背景
我写的这个临时程序用于通过比较文件中的数据来研究数百个生物体中基因流的演变:FeatureIDs = Stringprimitives(更进一步将这些列在第一列中列为"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,...
Run Code Online (Sandbox Code Playgroud)
问题
以前,仅仅从数据文件中创建双打的二维数组就足够了(数组排除了文件中的第一行和FeatureID,因为它们是字符串),然后使用2D数组进行double堆栈.将根据用户输入和确定的父节点和子节点进行堆栈Tree.
然后,父和子堆栈中的数据将同时弹出(从而确保比较相同的FeatureID而不必在DS中包含该数据)并根据它们是否满足定义的值来比较它们的值条件(即,如果两个值都> = 0.75).如果他们这样做,计数器会增加.比较完成后(堆栈为空),程序将返回计数.
现在我想做的而不仅仅是计算,是制作一个符合比较标准的列表.因此,我没有返回表示节点A和节点B之间有4100个FeatureID符合条件的计数器,而是希望列出Strings满足在节点A和节点B之间进行比较的标准的所有4100 FeatureID .我要保存以后列出的文件,但这里不关心.这意味着我可能不得不放弃之前运行良好的double2D阵列/ double堆栈方案.
问题
知道问题是什么,是否有一个聪明的解决方案,我可以在输入数据文件或我的代码中的某个地方(tlacMain.java)进行更改,而无需向进程添加更多数据?我只需要想法.
我不太确定我是否正确理解您的问题,但您可以将当前比较的FeatureID 添加到ArrayList,然后将其写入文件,而不是增加计数器。
如果你需要一个列表来进行每次比较,你可以有类似的东西HashMap<Comparison, ArrayList<String>>。
编辑:我阅读了您的评论并尝试在不进行太多更改的情况下提出解决方案:
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;
Run Code Online (Sandbox Code Playgroud)
在函数的这一部分中getFile(),您将 csv 读入双矩阵。对于i矩阵中的每一列,我们还需要相应的 featureID。要返回双精度矩阵和具有 featureID 的列表,您需要一个容器类。
class DataContainer {
public double[][] matrix;
public int[] featureIds;
public DataContainer(double[][] matrix, int[] featureIds) {
this.matrix = matrix;
this.featureIds = featureIds;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以更改上面的代码以返回两者。
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);
Run Code Online (Sandbox Code Playgroud)
在您的主函数中,您现在可以提取这两个结构。所以而不是
double newMatrix[][] = getFile(args);
Run Code Online (Sandbox Code Playgroud)
你可以写
DataContainer data = getFile(args);
double[][] newMatrix = data.matrix;
int[] featureIds = data.featureIds;
Run Code Online (Sandbox Code Playgroud)
您现在可以使用 featureIds 数组将其与计算中的矩阵列进行匹配。您可以为每个匹配创建一个and ,而不是增加intinside 。然后返回,以便您可以使用它在该函数之外进行报告。addedInternalArrayList<Integer>add(id)ArrayList
ArrayList<Integer> addedFeatureIds = addedInternal(parentStackOne, childStackOne, featureIdStack);
Run Code Online (Sandbox Code Playgroud)