0

嗨,我正在使用 Bluej 学习编程,问题是:从标准输入中,用分号替换所有逗号,但双引号内的逗号除外。

例如:“约翰,史密斯”有时会在这里,有能力并且准备好。

输出:“约翰,史密斯”在这里;有能力并准备好;有时。

除了引号中的字符串部分(“John,Smith”)之外,是否有使用 .replace(',',';') 的简单方法?还是我需要别的东西?

好的,所以我已经尝试过了,我认为这是一个不错的选择,它可以编译,但结果不能替换逗号

import java.util.*;
public class CSVFile{

    public static void main(String[]args){
        input();
    }

    public static void input(){
        Scanner kb = new Scanner(System.in);
        String info;
        System.out.println("Enter Data");    //User inputs in CSV File format
        info = kb.nextLine();

        while (!info.equals("#")){
            process(info);
            System.out.println("Enter Data");
            info = kb.nextLine(); 
        }
        System.out.println("End of Program");
    }

    public static void process (String info){
        int sl, i, qCount;
        sl = info.length();
        qCount = 0;
        for (i = 0; i < sl; i++){
            if (info.charAt(i)=='"'){
                qCount++;    //Quotation mark count                             
            }
            if (qCount%2 == 0 && info.charAt(i) == ',')    //if qCount remainder > 0 and info.charAt (i) == ','
            {
                info.replace(',',';');    //Replace commas with semicolons
            }
        }

        System.out.println(info+" "+qCount);
    }
}

在这里,我试图替换 info.charAt (i) 如果它是一个逗号但还没有正确。有什么建议么?

好的,尝试了一种不同的方法,它适用于该示例。

   public static void process(String info){
        StringBuilder str = new StringBuilder(info);
        int n = str.length();
        int q = 1;
        int j = 0;
        for (int i = 0; i < n; i++){
            if (str.charAt (i) == '"'){
                q++;
                j = q%2;                
            }
            if (str.charAt (i) == ',' && j > 0){
                str.setCharAt(i, ';');
            }
        }
        System.out.println("===================");
        System.out.println(str);
        System.out.println("===================");
    }

任何人都可以提出改进建议吗?我通过示例学习得更好,大声笑,因为您可以知道我花了多长时间才得出答案。我可以看到这将如何应用,就好像我刚刚用扫描仪打开了一个 FileReader 来读取一个实际的 CSV 文件一样。

4

1 回答 1

0

好的,花了一段时间,但我又回来了。问题是

'用分号替换所有逗号,但双引号内的逗号除外。//关闭引号。

例如:“约翰,史密斯”有时会在这里,有能力并且准备好。

输出:“约翰,史密斯”在这里;有能力并准备好;有时。

我用数组、列表和映射尝试了许多不同的代码,但归根结底,答案很简单,哈哈,我要感谢 'ddp' 提出了这个问题“替换字符串中特定索引处的字符? ”和“Petar Ivanov”作为他的回答。

这是第一次尝试:

import java.util.*;
public class CSVFile{

    public static void main(String[]args){
        input();
    }

    public static void input(){
        Scanner kb = new Scanner(System.in);
        String info;
        System.out.println("Enter Data");    //User inputs in CSV File format
        info = kb.nextLine();

        while (!info.equals("#")){
            process(info);
            System.out.println("Enter Data");
            info = kb.nextLine(); 
        }
        System.out.println("End of Program");
    }

    public static void process (String info){
        int sl, i, qCount;
        sl = info.length();
        qCount = 0;
        for (i = 0; i < sl; i++){
            if (info.charAt(i)=='"'){
                qCount++;    //Quotation mark count                             
            }
            if (qCount%2 == 0 && info.charAt(i) == ',')    //if qCount remainder > 0 and info.charAt (i) == ','
            {
                info.replace(',',';');    //Replace commas with semicolons
            }
        }

        System.out.println(info+" "+qCount);
    }
}

它并没有很好地工作,哈哈,它第一次做了,但是在大约 3 次之后就停止了一起工作。所以我一直在寻找解决方案。我找到了“ddp”和“Petar Ivanov”提供的解决方案

在他们的示例中,“ddp”想要更改特定的 charAt(特定索引),而“Petar”使用 StringBuilder 提供了此示例:

StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');

System.out.println(myName);

所以对于我的解决方案,我制作了以下工艺方法并替换了当前的工艺方法。

public static void process(String info){
        StringBuilder info2 = new StringBuilder(info);
        int n = info2.length();
        int q = 1;
        int j = 0;
        for (int i = 0; i < n; i++){
            if (info2.charAt (i) == '"'){
                q++;
                j = q%2;             //j is the remainder if q is an odd numder                
            }
            if (info2.charAt (i) == ',' && j > 0){
                info2.setCharAt(i, ';');
            }
        }
        System.out.println("===================");
        System.out.println(info2);
        System.out.println("===================");
    }

这仅在您使用引号开头的字符串并结束引号时才有效,否则它不知道该怎么做大声笑,但它适用于我所有以引号开头的示例。

对此的任何改进将不胜感激。

于 2013-08-08T07:33:58.340 回答