2013-04-22 157 views
1

我有串printet的行的文件在我的toString這樣的:正則表達式:查找字符串和數字

[Name: value][age: value][cprNumber: value][group: value][Active: value][Average Grade: float value]

我有讀取文件的讀法一類,並返回每一行作爲對象在ArrayList中。

現在回到我的主類,我試圖看看列表中的每個對象,這是我卡住的地方。我試圖找到平均成績高於4的對象。 有人能幫我用正確的正則表達式嗎?

+0

「ArrayList」中的行是如何存儲的?作爲字符串? – 2013-04-22 20:16:36

+0

是作爲字符串... – 2013-04-22 20:24:11

+1

如果不是存儲的行視爲字符串,你創建的對象的線模型這會容易得多。 – 2013-04-22 20:26:29

回答

1

您可以使用正則表達式來解析每個String並將鍵 - >值對放入Map。這將允許您在需要時訪問其他值。

所有你需要做的是,在循環中,您可以通過Map的密鑰並將其解析到float並檢查它的價值

public static void main(String[] args) throws ParseException { 
    final String[] strings = new String[]{ 
     "[Name: Bob][age: 27][cprNumber: 1234][group: A][Active: true][Average Grade: 4.1]", 
     "[Name: Alice][age: 17][cprNumber: 4321][group: A][Active: true][Average Grade: 4.5]", 
     "[Name: James][age: 33][cprNumber: 2134][group: B][Active: true][Average Grade: 2.2]", 
     "[Name: Frank][age: 23][cprNumber: 3124][group: B][Active: false][Average Grade: 3.1]" 
    }; 
    final Pattern pattern = Pattern.compile("\\[([^:]++):\\s([^]]++)]"); 
    final Collection<Float> grades = new LinkedList<Float>(); 
    for (final String string : strings) { 
     final Map<String, String> map = new HashMap<>(); 
     final Matcher matcher = pattern.matcher(string); 
     while (matcher.find()) { 
      final String key = matcher.group(1).trim(); 
      final String value = matcher.group(2).trim(); 
      map.put(key, value); 
     } 
     System.out.println(map); 
     final float grade = Float.parseFloat(map.get("Average Grade")); 
     if (grade > 4) { 
      grades.add(grade); 
     } 
    } 
} 

輸出:

{Name=Bob, Active=true, cprNumber=1234, age=27, Average Grade=4.1, group=A} 
{Name=Alice, Active=true, cprNumber=4321, age=17, Average Grade=4.5, group=A} 
{Name=James, Active=true, cprNumber=2134, age=33, Average Grade=2.2, group=B} 
{Name=Frank, Active=false, cprNumber=3124, age=23, Average Grade=3.1, group=B} 
[4.1, 4.5] 

這個例子有一個String[],但使用List將沒有區別。

你可以創建一個Object來保存值 - 這將是一個更OO的方法。

EDIT

下面是使用spilt一個例子。這是一個很多硬編碼 -

public static void main(String[] args) throws ParseException { 
    final String[] strings = new String[]{ 
     "[Name: Bob][age: 27][cprNumber: 1234][group: A][Active: true][Average Grade: 4.1]", 
     "[Name: Alice][age: 17][cprNumber: 4321][group: A][Active: true][Average Grade: 4.5]", 
     "[Name: James][age: 33][cprNumber: 2134][group: B][Active: true][Average Grade: 2.2]", 
     "[Name: Frank][age: 23][cprNumber: 3124][group: B][Active: false][Average Grade: 3.1]" 
    }; 
    final Collection<Float> grades = new LinkedList<Float>(); 
    for (final String string : strings) { 
     final String[] values = string.split("[\\[\\]]+|:"); 
     final float gpa = Float.parseFloat(values[12].trim()); 
     if (gpa > 4) { 
      grades.add(gpa); 
     } 
    } 
    System.out.println(grades); 
} 

輸出是一樣的:

[4.1, 4.5] 
0

正則表達式是不利於數計算/比較。

如果您的問題中的雙引號確實存在於您的文件中。對於你的例子,你可以得到一行,這將給你的浮點數(在字符串)。

row.split("\\"")[1]; 

那麼你就可以檢查以上>4值,你可能需要將其先轉換爲數字。

如果你可以使用第三部分庫,番石榴有一個不錯的filter()函數,你可以看看。

編輯

如果雙引號是不是在你的文件,你仍然可以使用split()

String[] arr=row.split("(: |])"); 
arr[arr.length-1] //this is the float 

例如:

final String[] arr = "[Name: value][age: value][cprNumber: value][group: value][Active: value][Average Grade: 4343.0]".split("(: |])"); 
    System.out.println(arr[arr.length - 1]); 

輸出:

4343.0 
相關問題