java - 计算字母表中的每个字母在 ArrayList 中的一系列字符串中出现的次数

标签 java arrays string arraylist char

我有一个 ArrayList,以“遛狗”的形式存储字符串或注释。我有一个 Notes 类,它的方法可以打印每个字母在整个 ArrayList 中出现的次数。我应该声明并使用大小为 26 的整数的原始数组,并使用 String 类中的 charAt 方法将笔记本中的每个字母转换为字符。然后我必须使用该字符来索引低级数组中的适当位置。这是我到目前为止的方法,但还没有完成:

public void printLetterDistribution() {
        ArrayList<Integer> aList = new ArrayList<Integer>();
        for (int i = 0; i < notes.size(); i++) {
            String note = notes.get(i);
            for (int j = 0; j < note.length(); j++) {
                char letter = note.charAt(j);
                int code = (int)letter;
                aList.add(code);
            }
        }
        Collections.sort(aList);

    }

我遇到了困难,不知道如何继续。正如您所看到的,我尝试将字母转换为其字符代码,但这可能不是最好的方法,而且我仍然陷入困境。有人可以帮忙吗?

编辑 - 这是整个笔记类:

public class Notebook {
    private ArrayList<String> notes;

    public Notebook() { notes = new ArrayList<String>(); }

    public void addNoteToEnd(String inputnote) {
        notes.add(inputnote);
    }

    public void addNoteToFront(String inputnote) {
        notes.add(0, inputnote);
    }

    public void printAllNotes() {
        for (int i = 0; i < notes.size(); i++) {
            System.out.print("#" + (i + 1) + " ");
            System.out.println(notes.get(i));
        }
        System.out.println();
    }

    public void replaceNote(int inputindex, String inputstring) {
        int index = inputindex - 1;
        if (index > notes.size() || index < 0) {
            System.out.println("ERROR: Note number not found!");
        } else {
            notes.set(index, inputstring);
        }
    }

    public int countNotesLongerThan(int length) {
        int count = 0;
        for (int i = 0; i < notes.size(); i++) {
            String temp = notes.get(i);
            if (temp.length() > length) {
                count++;
            }
        }
        return count;
    }

    public double averageNoteLength() {
        int sum = 0;
        for (int i = 0; i < notes.size(); i++) {
            String temp = notes.get(i);
            int length = temp.length();
            sum += length;
        }
        double average = (double)(sum / notes.size());
        return average;
    }

    public String firstAlphabetically() {
        String min = "";
        for (int i = 0; i < notes.size(); i++) {
            for (int j = i + 1; j < notes.size(); j++) {
                if ((notes.get(i)).compareTo(notes.get(j)) < 0) {
                    min = notes.get(i);
                } else {
                    min = notes.get(j);
                }
            }
        }
        return min;
    }

    public void removeNotesBetween(int startnote, int endnote) {
        int start = startnote - 1;
        int end = endnote - 1;
        for (int i = end - 1; i > start; i--) {
            notes.remove(i);
        }
    }

    public void printNotesContaining(String findString) {
        for (int i = 0; i < notes.size(); i++) {
            if (notes.get(i).contains(findString)) {
                System.out.println("#" + i + " " + notes.get(i));
            }
        }
    }

    public int countNumberOf(String letter) {
        int count = 0;
        for (int i = 0; i < notes.size(); i++) {
            String note = (notes.get(i));
            for (int j = 0; j < note.length(); j++) {
                if (note.charAt(j) == letter.charAt(0)) {
                    count++;
                }
            }

        }
        return count;
    }

    public void findAndReplaceFirst(String old, String newWord) {
        for (int i = 0; i < notes.size(); i++) {
            String note = notes.get(i);
            if (note.contains(old)) {
                int loc = note.indexOf(old);
                int len = old.length();
                String temp = note.substring(0, loc ) + note.substring(loc + len, note.length());
                String newString = temp.substring(0, loc) + newWord + temp.substring(loc, temp.length());
                notes.set(i, newString);
            } else {
                String newString = note;
                notes.set(i, newString);
            }
        }
    }

    public void printLetterDistribution() {
        int[] p = new int[26];
        for (int i = 0; i < 26; i++) {
            p[i] = 0;
        }
        for (int i = 0; i < notes.size(); i++) {
            String note = notes.get(i);
            note = note.toLowerCase();
            for (int j = 0; j < note.length(); j++) {
                char letter = note.charAt(j);
                p[letter - 'a']++;
            }
        }
        System.out.println(p);
    }

}

最佳答案

您可以使用长度为 26 的 int 数组并递增索引字母 - 'a' 的计数;

int[] p = new int[26];
for(int i = 0; i < 26; i++) p[i] = 0;
for (int i = 0; i < notes.size(); i++) {
        String note = notes.get(i);
        for (int j = 0; j < note.length(); j++) {
            char letter = note.charAt(j);
             if(letter>= 'a' && letter <= 'z')
               p[letter-'a']++;

 }

PS:我假设注释仅是小写的。如果不是这种情况,请使用 note.toLowerCase() 使它们变小。

由于您的笔记中可以有空格,因此我更新了代码。

关于java - 计算字母表中的每个字母在 ArrayList 中的一系列字符串中出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35952529/

相关文章:

java - 对正在运行的 Java 应用程序进行 Java 调用的 Python egg

java - 用于签名证书的 SAML 样本身份提供者证书和 Java 应用程序

c++ - 文件输入到 struct struct 数组中

java - 为什么这个例子的时间复杂度是从 "Cracking the Coding Interview"O(k c^k)?

ruby - Ruby 中的 substr 是什么?

javascript - 如何从 javascript 字符串末尾删除可变数量的字符

java - ConcurrentHashMap<Integer, ArrayList<Object>> 线程安全吗?

c# - 为什么我在生成 Random() 数字时会得到奇怪的结果?

java - 将 ArrayList 转换为数组

Java:(int)(float)Float.valueOf(s) 或 Float.valueOf(s).toInt()