gpt4 book ai didi

Java使用对象来保存状态似乎不起作用

转载 作者:行者123 更新时间:2023-12-01 23:00:17 25 4
gpt4 key购买 nike

我正在编写一个实用程序类,它应该能够解析分隔文件(逗号、竖线、冒号分隔)。它读取特定行并需要提取该行中最常用的分隔符。但这似乎并没有按预期工作。当我在主方法调用者类中调用 getHeader() 方法时,似乎唯一被确认的分隔符是行中的逗号。我认为我的java和oop缺乏技能阻碍了我理解这个问题。请指教。先感谢您。下面是我的代码:

    public class Parser {
// sample line of data
String line = "There|is|data,in,this:file|hause";

private static class Delimiters {
static char DEFAULT = ',';
static char COMMA = ',';
static char SEMI = ';';
static char PIPE = '|';
static char COLON = ':';
};

public String[] getHeader() {
char delim = findDelimiter(line);
System.out.println("Header delim: " + delim);
String[] columns = line.split(String.valueOf(delim));
return columns;
}

// figure out the delimiter of the file. This method
// gets called on lines of file data
public char findDelimiter(String line) {
Delimiter dim = new Delimiter();
for (int i = 0; i < line.length(); i++) {
for (char delim : Arrays.asList(Delimiters.COLON, Delimiters.COMMA,
Delimiters.PIPE, Delimiters.SEMI)) {
if (delim == line.charAt(i)) {
dim.increaseDelimiterCnt(delim);
}
}
}

final char theLinesDelimiter = dim.mostCommonDelimiter();
return theLinesDelimiter;
}

private class Delimiter {
Map<Character, Integer> delimiterCounts = new HashMap<Character, Integer>();

private void increaseDelimiterCnt(char delim) {
System.out.println(delim);

int value = (delimiterCounts.containsKey(delim) ? delimiterCounts
.get(delim) : 0);
delimiterCounts.put(delim, value++);
System.out.println(getDelimiterCounts());
}

private Map<Character, Integer> getDelimiterCounts() {
return delimiterCounts;
}

/**
* Gets the delimiter based on greatest frequency of first line in file.
*
* @return String
*/
private char mostCommonDelimiter() {
char theDelimiter = ',';
System.out.println(delimiterCounts);
int maxValueInMap = (Collections.max(delimiterCounts.values()));
for (Map.Entry<Character, Integer> entry : delimiterCounts
.entrySet()) {
if (entry.getValue().equals(maxValueInMap)) {
theDelimiter = entry.getKey();
}
}
return theDelimiter;
}
}

}

最佳答案

错误在这一行:

            delimiterCounts.put(delim, value++);

++变量名之后是一个 post 增量,所以尽管 value++增量value ,它仍然评估为原始值。所以,上面相当于:

            delimiterCounts.put(delim, value);
value = value + 1; // pointless, since we never use value again

相反,你应该写:

            delimiterCounts.put(delim, value + 1);

您的调试输出实际上应该足以告诉您这一点;它显示 delimiterCounts 中的每个分隔符被映射到零。

我建议您阅读Eric Lippert's blog post, "How to debug small programs" 。您可能会发现它对 future 很有用。

(注意:解决上述问题后,您将遇到另一个问题。您的程序现在将正确识别 | 作为分隔符,但 line.split("|") 并不意味着您想要的。要解决这个问题,您'我会想使用 Pattern.quote 。我会让你弄清楚详细信息。)

<小时/>

编辑添加:由于您对 OOP 有所担忧,所以我还应该谈谈整体设计。您可以通过使用枚举来创建更稳健、更高效的设计:

public enum Delimiter {
COMMA(','), SEMI(';'), PIPE('|'), COLON(':');

public final char c;
public final Pattern pattern;

private DelimiterChar(final char c) {
this.c = c;
this.pattern = Pattern.compile(Pattern.quote(Character.toString(c)));
}
}

然后您可以使用 Delimiter.values()当您需要枚举可能的分隔符时,可以使用 EnumSet<Delimiter, Integer>按分隔符存储计数。

请注意,我使用了名称 Delimiter为了一些与你非常不同的东西。您的Delimiter类可能应该被称为 DelimiterCounter ,因为它的实例计算分隔符,而不是它们本身分隔任何内容。

关于Java使用对象来保存状态似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com