簡體   English   中英

填充動態2D Java數組

[英]populate dynamic 2D java array

我想讀取一個文件,並將每行的內容寫到一個尺寸為[3] [不確定,但很長]的數組中

到目前為止,我有以下代碼,可以使用模式匹配器來找出我要查找的輸入文件的組件,但是,該代碼停留在輸入的第一行,並且一遍又一遍地添加,如何使輸入文件進行進度並每次都在數組中寫入新行。

到目前為止,我的代碼如下所示:

public static void main(String[] args) throws IOException
{   

    BufferedReader br_0 = new BufferedReader(new FileReader("file.txt"));
    String line_0;

    //while the file is still reading
    while ((line_0 = br_0.readLine()) != null) 
    {           

        int i = 0;
        Pattern p = Pattern.compile("'(.*?)'(?![a-zA-Z])");
        //count from zero
        String[][] arr = new String[262978][3];

        for (int count = 0; count < 262978; count++) 
        {

            Matcher m = p.matcher(line_0);

            int j = 0;
            while (m.find()) 
            {
                arr[i][j++] = m.group(1);
            }
            i++;

        }
    }
    br_0.close();
}

輸入文件如下所示:

'end with'('the playing of the british national anthem', 'hong kong').
'follow at'('the stroke of midnight', 'this').
'take part in'('the ceremony', 'both countries').
'start at about'('# pm', 'the ceremony').
'end about'('# am', 'the ceremony').
'lower'('the british hong kong flag', '# royal hong kong police officers').
'raise'('the sar flag', 'another #').
'leave for'('the royal yacht britannia', 'the #').
'hold by'('the chinese and british governments', 'the handover of hong kong').
'rise over'('this land', 'the regional flag of the hong kong special administrative region of the people \'s republic of china').
'cast eye on'('hong kong', 'the world').
'hold on'('schedule', 'the # governments').
'be festival for'('the chinese nation', 'this').
'go in'('the annals of history', 'july # , #').
...

理想情況下,數組索引應如下所示:

[0] [0] end with

[0] [1] the playing of the british national anthem

[0] [2] hong kong

[1] [0] follow at

[1] [1] the stroke of midnight

[1] [2] this

[2] [0] take part in

[3] [1] the ceremony

[2] [2] both countries

重要的是數組長度能夠容納很長的文件,但也可以容納短的文件。

此時的輸出如下所示:

[45993][2] the president of the people \'s republic of china he mr jiang zemin
[45994][0] speak at
[45994][1] the ceremony
[45994][2] the president of the people \'s republic of china he mr jiang zemin
[45995][0] speak at
[45995][1] the ceremony
[45995][2] the president of the people \'s republic of china he mr jiang zemin
[45996][0] speak at
[45996][1] the ceremony
[45996][2] the president of the people \'s republic of china he mr jiang zemin
[45997][0] speak at
[45997][1] the ceremony
[45997][2] the president of the people \'s republic of china he mr jiang zemin
[45998][0] speak at
[45998][1] the ceremony
[45998][2] the president of the people \'s republic of china he mr jiang zemin
[45999][0] speak at

這將處理第一行262978次。

for (int count = 0; count < 262978; count++) 

更好的是:

int count = 0;
String[][] arr = new String[262978][3];
Pattern p = Pattern.compile("'(.*?)'(?![a-zA-Z])"); 
//while the file is still reading
while ((line_0 = br_0.readLine()) != null) {           
     Matcher m = p.matcher(line_0);
     int j = 0;
     while (m.find()) {
         arr[count][j++] = m.group(1);
     }
     count++;
}

br_0.close();

但是,不應使用幻數262978,也不應使用數組。 顯然,最大的假設。 每行三個字符串不正確。

替換為

List<List<String>> arr = new ArrayList<>();
Pattern p = Pattern.compile("'(.*?)'(?![a-zA-Z])"); 
//while the file is still reading
while ((line_0 = br_0.readLine()) != null) {
     List<String> three = new ArrayList<>();         
     Matcher m = p.matcher(line_0);
     int j = 0;
     while (m.find()) {
         three.add( m.group(1) );
     }
     arr.add( three );
}

br_0.close();

打印,

for( List<String> three: arr ){
    for( String s: three ){
        System.out.print( s  + " " );
    }
    System.out.println();
}

您正在此處從文件中讀取數據: while ((line_0 = br_0.readLine()) != null) ,但是,您正在此處for (int count = 0; count < 262978; count++) 同一行的262978迭代: for (int count = 0; count < 262978; count++)

您可以做的是將其替換為以下內容:

int i = 0;
Pattern p = Pattern.compile("'(.*?)'(?![a-zA-Z])");
//count from zero
String[][] arr = new String[262978][3];
while (((line_0 = br_0.readLine()) != null) && (i < 262978))
{
    Matcher m = p.matcher(line_0);

    int j = 0;
    while (m.find()) 
    {
        arr[i][j++] = m.group(1);
    }
    i++;    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM