如何使用2d数组java进行逻辑运算?
我正在开发一个JavaFX程序,它读取数据文件并开始处理列 到目前为止,我正在读取文件,然后循环遍历每一列,构建一个二维数组 这样我可以计算平均值和中值。 但我想知道如何在java中对这些列进行逻辑操作 假设我们有一个包含以下列和行的文件,在本例中,假设文件中的元素用逗号分隔(但它们可能不是) 现在,用户希望找到满足以下条件的所有行:如何使用2d数组java进行逻辑运算?,java,arrays,javafx,Java,Arrays,Javafx,我正在开发一个JavaFX程序,它读取数据文件并开始处理列 到目前为止,我正在读取文件,然后循环遍历每一列,构建一个二维数组 这样我可以计算平均值和中值。 但我想知道如何在java中对这些列进行逻辑操作 假设我们有一个包含以下列和行的文件,在本例中,假设文件中的元素用逗号分隔(但它们可能不是) 现在,用户希望找到满足以下条件的所有行: V1 > 2 AND V2 < 3 OR V3 < 4 欢迎任何帮助 只需像您所说的那样读取数组中的文件,然后在数组中迭代,并检查给定的条件例
V1 > 2 AND V2 < 3 OR V3 < 4
欢迎任何帮助 只需像您所说的那样读取
数组中的文件
,然后在数组
中迭代
,并检查给定的条件例如,您最好使用一些解析器支持
你可以这样写:
exp = parser.parseExpression("v[0] > 2 AND v[1] < 3 OR v[2] < 4");
System.out.println(exp.getValue(v,Boolean.class));
public interface Criterion {
public boolean matches(Map<String, Integer> data) ;
}
exp=parser.parseExpression(“v[0]>2和v[1]<3或v[2]<4”);
System.out.println(exp.getValue(v,Boolean.class));
其中v是2d数组的一行,索引从0开始。这个问题对于本论坛来说实在太广泛了,但我会通过为筛选数据的标准创建一个小对象模型来解决这个问题。比如:
exp = parser.parseExpression("v[0] > 2 AND v[1] < 3 OR v[2] < 4");
System.out.println(exp.getValue(v,Boolean.class));
public interface Criterion {
public boolean matches(Map<String, Integer> data) ;
}
公共接口标准{
公共布尔匹配(地图数据);
}
与
公共类不平等实现了标准{
公共枚举操作{小于,大于}
私人最终运营;
私有最终字符串变量;
私有最终整数值;
公共标准(操作op、字符串变量、int值){
this.op=op;
this.variable=变量;
这个值=值;
}
@凌驾
公共布尔匹配(地图数据){
如果(!data.containsKey(变量)){
返回false;//或引发异常。。。
}
int dataValue=data.get(变量);
开关(操作){
大小写小于:返回数据值<值;
大小写大于:返回数据值>值;
默认值://抛出异常。。。
}
}
}
然后将这些类组合起来:
public class And implements Criterion {
private Criterion left ;
private Criterion right ;
public And(Criterion left, Criterion right) {
this.left = left ;
this.right = right ;
}
@Override
public void matches(Map<String, Integer> data) {
return left.matches(data) && right.matches(data);
}
}
公共类和实现标准{
私人标准左;
私权;
公共和标准(左、右){
this.left=左;
这个。右=右;
}
@凌驾
公共无效匹配(地图数据){
返回left.matches(数据)和right.matches(数据);
}
}
对于或
也同样如此
现在,根据您对UI的描述,创建表示UI状态的
标准
对象应该非常简单。然后只需将表的每一行(表示为从变量名到值的映射)通过标准的匹配方法传递,返回true的是匹配过滤器的行。这里是一个可以使用的快速方法
你的比较很奇怪<代码>V1>2和V2<3或V3<4
publicstaticvoidmain(字符串[]args)
{
//此处的TODO代码应用程序逻辑
字符串[]linesFromFile={“1,4,1,4”,
"2, 5, 2, 4",
"3, 2, 3, 5",
"4, 3, 4, 2"};
List saveTrueDataHere=new ArrayList();
对于(int i=0;i2&&Integer.parseInt(项[1])<3 | | Integer.parseInt(项[2])<4;
}
当出现像V1&(V2 v V3)这样的操作时,您如何管理?感谢毫无理由的否决票。这个问题对于本论坛来说似乎太广泛了。你到底被困在这里的是哪一部分?用户是如何为数据指定过滤条件的?我被解析部分卡住了,在解析部分中,用户选择要从中获取数据的列,然后程序打印出符合条件的所有行。如示例所示,用户希望找到符合条件的所有行。在这种情况下,V1>2,V2<3,V3<4。用户可以在列上进行和/或操作。但您也可以构建一个GUI,允许用户构建不需要解析的表达式……目前它的工作方式如下:程序读取文件。从该文件中,用户将获得标题,例如可以使用的列名。然后,要过滤列,用户可以选择要使用的列名,选择>或<并输入列值。然后有一个按钮以同样的方式添加更多表达式和操作。她只能做和/或手术,而且可以做任何她喜欢的手术。我试试看。V1、V2等只是默认的列名。例如,重点是查找高度>150或宽度<100。其中V1=高度,V2=宽度。谢谢,我会试一试这对我帮助很大!非常感谢。我修改了一位并添加了更多的操作数。使用地图使事情变得容易一些。但将文件数据存储到地图上是否是一种良好的做法?目前,我使用Map
将列值存储到列表中,并且可以通过键(作为标题)轻松访问。
public class And implements Criterion {
private Criterion left ;
private Criterion right ;
public And(Criterion left, Criterion right) {
this.left = left ;
this.right = right ;
}
@Override
public void matches(Map<String, Integer> data) {
return left.matches(data) && right.matches(data);
}
}
public static void main(String[] args)
{
// TODO code application logic here
String[] linesFromFile = {"1, 4, 1, 4",
"2, 5, 2, 4",
"3, 2, 3, 5",
"4, 3, 4, 2"};
List<String> saveTrueDataHere = new ArrayList();
for(int i = 0; i < linesFromFile.length; i++)
{
System.out.println(linesFromFile[i] + ": " + compareItemsInLine(linesFromFile[i]));
if(compareItemsInLine(linesFromFile[i]))
{
saveTrueDataHere.add(linesFromFile[i]);
}
}
System.out.println("Number of true items saved: " + saveTrueDataHere.size());
//Print the items that returned true.
for(String item : saveTrueDataHere)
{
System.out.println(item);
}
}
static boolean compareItemsInLine(String line)
{
String items[] = line.split(", ");
// v1 v2 v3
return Integer.parseInt(items[0]) > 2 && Integer.parseInt(items[1]) < 3 || Integer.parseInt(items[2]) < 4;
}