2017-03-09 59 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