gpt4 book ai didi

java - 为什么我的程序无法正确检查列表是否已包含特定字符?

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:09 25 4
gpt4 key购买 nike

我正在创建一个类,它解析文件中的所有字符并查找每个字母出现的次数。

第一步,当我浏览文件添加字符时,我会检查字符列表是否已包含我所在的特定字符。如果不存在,则将其添加到列表中,出现次数值为 1;如果已包含该列表,则将出现次数增加 1。

但是,我的下面的代码无法正确确定列表是否已包含特定字符。

我正在使用 ArrayList,并且我知道我必须重写 CharProfile 类中的 equals 方法(我确实这样做了),以便 contains() 使用的 equals() 方法正常工作。

重写 CharProfile 中的 equals 方法:

    @Override
public boolean equals(Object o) {
if (this.character == ((Character)o)) {
return true;
}
else {
return false;
}
}

代码:

import java.util.*;
import java.io.*;

public class HuffmanCoder {
public static void main(String[] args) throws IOException {
Scanner keyboard = new Scanner(System.in);

System.out.print("Please enter the name of the file to be read from: ");
String fileName = keyboard.nextLine();

File file = new File(fileName);
Scanner inputFile = new Scanner(file);

int charCount = 0;
ArrayList<CharProfile> charOccurrences = new ArrayList<CharProfile>();

while (inputFile.hasNext()) {
// Grabs the next word in the file and converts it into a char array
String word = inputFile.next();
char[] wordArray = word.toCharArray();

// Parses the word on a char-by-char basis
for (int i = 0; i < wordArray.length; i++) {
if (wordArray[i] != ' ') {
charCount++;

// Constructs the list of chars and their respective number of occurrences
if (!charOccurrences.contains(wordArray[i])) {
charOccurrences.add(new CharProfile(wordArray[i]));
}
else {
for (int j = 0; j < charOccurrences.size(); j++) {
if (charOccurrences.get(j).getCharacter() == wordArray[i]) {
charOccurrences.get(j).incremementOccurrences();
break;
}
}
}
}
}
}

// Figure out each char's probability
for (int i = 0; i < charOccurrences.size(); i++) {
System.out.println(charOccurrences.get(i).getCharacter());
}
}
}

完整的 CharProfile 类:

public class CharProfile {
private char character;
private int occurrences;
private double probability;

public CharProfile(char character) {
this.character = character;
occurrences = 1;
}

public void incremementOccurrences() {
occurrences++;
}

public char getCharacter() {
return character;
}

public void setCharacter(char character) {
this.character = character;
}

public int getOccurrences() {
return occurrences;
}

public void setOccurrences(int occurrences) {
this.occurrences = occurrences;
}

public double getProbability() {
return probability;
}

public void setProbability(double probability) {
this.probability = probability;
}

public boolean equals(char character) {
if (this.character == character) {
return true;
}
else {
return false;
}
}

@Override
public boolean equals(Object o) {
if (this.character == ((Character)o)) {
return true;
}
else if (this.character == ((Character)o).charValue()) {
return true;
}
else {
return false;
}
}
}

问题简而言之:在检查列表是否已包含该字符时,它似乎总是返回 false,而不是返回 true,导致文件中的每个字符都被添加到列表中,而它应该只是唯一的字符。

最佳答案

这只是比较对象引用是否相同,并且实例是 Character 而不是 CharProfile

@Override
public boolean equals(Object o) {
if (this.character == ((Character)o)) {
return true;
}
else {
return false;
}
}

您需要更改 equals 方法以接受 CharProfile 实例并比较其中的字符值,如下所示:

@Override
public boolean equals(Object o) {
if(this.character == ((CharProfile)o).getCharacter()) {
return true;
}else {
return false;
}
}

编辑:您的 equal 方法没有被调用,因为您将 char 传递给 contains 方法。

请将其更改为:

         // Constructs the list of chars and their respective number of occurrences
CharProfile charProfile = new CharProfile(wordArray[i]);
if (!charOccurrences.contains(charProfile)) {
charOccurrences.add(charProfile);
}

关于java - 为什么我的程序无法正确检查列表是否已包含特定字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114272/

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