0

我正在使用 java Scanner 尝试从名为 Inventory.txt 的文本文件中提取产品信息。

此文件包含以下格式的产品数据:

“Danelectro|Bass|D56BASS-AQUA|336177|395.00Orange|Amplifier|BT1000-H|319578|899.00Planet Waves|Superpicks|1ORD2-5|301075|4.50Korg|X50 Music Synthesizer|X50|241473|735.00Alpine|Alto Sax|AAS143|198490|795.00”

我正在尝试解析字符串并将它们添加到 arraylist 中,以便 arraylist 中的每个元素看起来像这样:

"Danelectro|Bass|D56BASS-AQUA|336177|395.00"
"Orange|Amplifier|BT1000-H|319578|899.00"    
"KorPlanet Waves|Superpicks|1ORD2-5|301075|4.50"
"g|X50 Music Synthesizer|X50|241473|735.00"
"Alpine|Alto Sax|AAS143|198490|555.00”

以下是我的代码:

public class ItemDao {        
    public ItemDao() {
        scanFile();
    }

    public void scanFile() {
        Scanner scanner; 
        ArrayList <String> content = new ArrayList <String>();
        try {
            Pattern p1 = Pattern.compile("\\.[0-9]{2}$");
            scanner = new Scanner(new File("Inventory.txt"));

            while (scanner.hasNext(p1)) {
                content.add(scanner.next(p1));
            }

            for (String item : content) {
                System.out.println("Items:" + item);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

当我测试这段代码时,我发现arraylist 是空的。任何帮助将非常感激。

java -jar A00123456Lab5.jar

在 dao 包中创建一个 ItemDAO 类 该类将包含一个实现 Comparator 的静态内部类(DAO = 数据访问对象)

4

2 回答 2

2

您可以在 String 上定义 Scanner 和分隔符。由于| 在正则表达式中用作 OR 组合器,您必须使用(双)反斜杠对其进行屏蔽:

sc = new java.util.Scanner ("Danelectro|Bass|D56BASS-AQUA|336177|395.00");
sc.useDelimiter ("\\|");

String name = sc.next ();
// name: java.lang.String = Danelectro
String typ = sc.next ();
// typ: java.lang.String = Bass
String model = sc.next
// model: java.lang.String = D56BASS-AQUA
int id = sc.nextInt ();
// id: Int = 336177
val d = sc.nextDouble ();
// d: Double = 395.0
于 2012-05-13T11:32:54.833 回答
1

我看到您正在使用一种模式,这些模式可以派上用场——但我只取每一行并对其进行子串化。

while(scanner.hasNextLine()){
    String temp = scanner.nextLine();
    while(temp.indexOf("|") != -1){
        content.add(temp.substring(temp.indexOf("|"));
        temp.substring(temp.indexOf("|")+1);
    }    
}

只是一个想法 - 使用这种方式可能更容易调试。

于 2012-05-13T05:07:17.593 回答