如何使用2d数组java进行逻辑运算?

时间:2017-03-09 16:35:12

标签: java arrays javafx

我正在开发一个JavaFX程序,它读入数据文件并开始处理列。

到目前为止,我正在读取文件,然后循环遍历每一列,我构建了一个二维数组。

这样我可以计算平均值和中值。 但我想知道如何在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

在这种情况下,结果将是第1行,第2行和第3行,我需要在程序完成文件后保存到文件中。

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

欢迎任何形式的帮助!

4 个答案:

答案 0 :(得分:1)

这个问题对于这个论坛来说实在太宽泛了,但我会通过为您过滤数据的标准创建一个小对象模型来解决这个问题。如下所示:

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 ...
        }
    }
}

然后将这些组合起来:

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);
    }
}

,同样适用于Or

现在,根据您对UI的描述,创建表示UI状态的Criterion对象应该非常简单。然后通过Criterion的{​​{1}}方法传递表格的每一行(表示为从变量名称到值的映射),返回true的那些是与过滤器匹配的那一行

答案 1 :(得分:0)

只需按照您所说的filearray通过iterate阅读array并查看给定条件

答案 2 :(得分: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是你的2d数组的一行,索引从0开始。

答案 3 :(得分: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;
}