2017-03-09 57 views
-2

我正在研究读取数据文件并开始处理列的JavaFX程序。如何使用2d数组java进行逻辑运算?

到目前为止,我正在阅读文件,然后我遍历每一列,我构建了一个2d数组。

这样我可以计算平均值和中值。 但我想知道如何使用java中的这些列进行逻辑运算?假设我们有一个包含以下列和行的文件,在这个例子中,让我们假设文件中的元素用逗号分隔(但它们可能不是)。现在

V1,V2,V3,V4 
1, 4, 1, 4 
2, 5, 2, 4 
3, 2, 3, 5 
4, 3, 4, 2 

,用户想要找到符合下列所有行:

V1 > 2 AND V2 < 3 OR V3 < 4 

在这种情况下,结果会是第一,第二和第三排,我需要保存成文件,程序结束后的文件。

V1,V2,V3,V4 
1, 4, 1, 4 
2, 4, 2, 5 
3, 2, 3, 5 

欢迎任何形式的帮助!

+0

感谢downvote也没有理由 – AverageJoe9000

+0

这个问题似乎是这个论坛太宽泛。你究竟在这里坚持什么?用户如何指定数据的过滤标准? –

+0

我遇到了解析部分,用户在其中选择要从中获取数据的列,程序打印出符合条件的所有行。例如,用户希望查找符合条件的所有行。在这种情况下,V1> 2和V2 <3 v V3 <4. 用户可以在列上进行AND/OR操作。 – AverageJoe9000

回答

0

array刚才看了file像你说的和iterate通过array和检查给定的标准

+0

以及如何进行像V1&(V2 v V3)这样的操作? – AverageJoe9000

0

你最好使用一些解析器支持,例如SpEL 你可以写类似:

exp = parser.parseExpression("v[0] > 2 AND v[1] < 3 OR v[2] < 4"); 
System.out.println(exp.getValue(v,Boolean.class)); 

其中v是你的二维数组的一行,与指数从0

+0

谢谢你!我会看看它 – AverageJoe9000

+0

但你也可以建立一个图形用户界面,允许用户建立并不需要解析的表达式... –

+0

目前它的工作原理是这样的: 程序在文件中读取。从该文件中,用户将获得标题,例如她可以使用的列名。 然后,要过滤列,用户可以选择想要使用的列名,选择>或<并输入列值。 然后有一个按钮以相同的方式添加更多的表达式和操作。她可以只做和/或操作,并且尽可能多地她喜欢。 – AverageJoe9000

1

开始这个问题是真实的对于这个论坛来说太广泛了,但我会通过为你过滤数据的标准创建一个小对象模型来解决这个问题。因此,像:为Or

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 interface Criterion { 

    public boolean matches(Map<String, Integer> data) ; 

} 

public class Inequality implements Criterion { 

    public enum Operation { LESS_THAN, GREATER_THAN } 

    private final Operation operation ; 

    private final String variable ; 

    private final int value ; 

    public Criterion(Operation op, String variable, int value) { 
     this.op = op ; 
     this.variable = variable ; 
     this.value = value ; 
    } 

    @Override 
    public boolean matches(Map<String, Integer> data) { 
     if (! data.containsKey(variable)) { 
      return false ; // or throw exception... 
     } 
     int dataValue = data.get(variable); 
     switch (operation) { 
      case LESS_THAN: return dataValue < value ; 
      case GREATER_THAN: return dataValue > value ; 
      default: // throw exception ... 
     } 
    } 
} 

然后类这些结合起来。

现在,考虑到您对UI的描述,创建表示UI状态的对象应该非常简单。然后通过Criterionmatches方法传递表中的每一行(表示为从变量名到值的映射),并且返回true的那些是与过滤器匹配的那些。

+0

这帮了我很多!谢谢!我修改了一下并添加了更多的操作数。 使用地图使事情变得更简单。但是,将文件数据存储到映射是否是一种好的做法?目前我使用'Map >'将列值存储到List中,并且可以通过键(如标题)轻松访问。 – AverageJoe9000

0

下面是一个可以使用的快速方法。

虽然你的比较很奇怪。V1 > 2 AND V2 < 3 OR V3 < 4

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; 
} 
+0

我试试看。 V1,V2等仅仅是默认的列名。例如,重点是查找高度> 150或宽度<100。其中V1 =高度,V2 =宽度。 谢谢,我试试看 – AverageJoe9000