0

ユーザーが数字を入力するときに、ユーザーがプログラムに入力した数字の出現回数を数えようとしています。それらはすべて整数です。これは TextArea に表示する必要があります。複数の数字の出現回数が同じ場合は、TextArea にも表示する必要があります。

これを行う方法について、非常に紛らわしい情報を見つけました。

TreeMap を使用して数値を追加することから始めました。各数値が入力されると、その数値が既に入力されているかどうかがチェックされます。そうでない場合は、それをキーに入力して値 1 を割り当てます。それ以外の場合は、値に 1 を追加します。

Java API を何度も読みました。私はSortedMapを見つけましたが、本質的にはうまくいきません。私が理解していることから、すでにTreeMapのキーでソートされています。TreeMap を値で並べ替えてから、対応する同じ値を持つすべてのキーを選択したいと思います。値でソートする方法を見つけましたが、それを実装すると、.last().getKey().intValue() しか取得できなくなります。配列が理想的かもしれないと思っていましたが、どうすればよいかわかりません。

ああ、私はJavaの2番目のクラスにいるので、ほとんど知らないし、知らないことはさらに少ないので、覚えておいてください.

public class NumberCounterGUI extends JFrame {

    JLabel jlblEnteranumber = new JLabel("Enter a number:");

    JTextField jtfEnteranumber = new JTextField();

    JTextArea jtaNumbers = new JTextArea();
    JTextArea jtaMessages = new JTextArea();

    JScrollPane numbersScrollPane = new JScrollPane(jtaNumbers);

    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel(new BorderLayout());

    Color defaultBackgroundColor = new Color(238, 238, 238);

    Font defaultFontBold = new Font("Dialog", Font.BOLD, 12);

    TreeMap<Integer, Integer> numbersEntered = new TreeMap<>();

    int numberEntered, value;

    public NumberCounterGUI() {

        jtfEnteranumber.setPreferredSize(new Dimension(84, 20));
        jtfEnteranumber.setToolTipText("Integers Only");
        jtfEnteranumber.addActionListener(new NumberCounterGUI.Listener());

        jtaNumbers.setEditable(false);
        jtaNumbers.setLineWrap(true);
        jtaNumbers.setWrapStyleWord(true);

        numbersScrollPane.setVerticalScrollBarPolicy(JScrollPane
                .VERTICAL_SCROLLBAR_AS_NEEDED);
        numbersScrollPane.setPreferredSize(new Dimension(300, 75));

        jtaMessages.setFont(defaultFontBold);
        jtaMessages.setBackground(defaultBackgroundColor);
        jtaMessages.setEditable(false);

        panel1.add(jlblEnteranumber);
        panel1.add(jtfEnteranumber);

        panel2.add(jtaMessages);

        panel3.add(panel1, BorderLayout.NORTH);
        panel3.add(numbersScrollPane, BorderLayout.CENTER);
        panel3.add(jtaMessages, BorderLayout.SOUTH);

        add(panel3);
    }

    class Listener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                Long numberEnteredLong = Long.valueOf(jtfEnteranumber.getText());
                if (numberEnteredLong <= 2147483647 &&
                        numberEnteredLong >= -2147483647) {
                    numberEntered = Integer.valueOf(jtfEnteranumber.getText());
                    jtaNumbers.insert(jtfEnteranumber.getText() + " ", 1);
                    if (numbersEntered.get(numberEntered) == null) {
                        numbersEntered.put(numberEntered, 1);
                    } else {
                        value = numbersEntered.get(numberEntered).intValue();
                        value++;
                        numbersEntered.put(numberEntered, value);
                    }
                    jtaMessages.setText(entriesSortedByValues(numbersEntered)
                            .last().getKey().intValue() +" occurred most often");
                    jtfEnteranumber.setText("");
                } else {
                    Toolkit.getDefaultToolkit().beep();
                    jtaMessages.setText(jtfEnteranumber.getText()
                            + " is out of integer range!");
                    jtfEnteranumber.setText("");
                }
            } catch (NumberFormatException z) {
                Toolkit.getDefaultToolkit().beep();
                jtaMessages.setText(jtfEnteranumber.getText()
                        + " is not a number!");
                jtfEnteranumber.setText("");
            }
            pack();
        }
    }

    // Found at http://stackoverflow.com/questions/2864840/treemap-sort-by-value
    static <K, V extends Comparable<? super V>> SortedSet<Map.Entry<K, V>>
            entriesSortedByValues(Map<K, V> map) {
        SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<>(
                new Comparator<Map.Entry<K, V>>() {
                    @Override
                    public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) {
                        int res = e1.getValue().compareTo(e2.getValue());
                        return res != 0 ? res : 1;
                    }
                });
        sortedEntries.addAll(map.entrySet());
        return sortedEntries;
    }

    public static void main(String[] args) {
        NumberCounterGUI frame = new NumberCounterGUI();
        frame.setTitle("Enter Numbers (Integers 1 - 999)");
        frame.pack();
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
4

3 に答える 3

2

-Collections.frequency(Collection c, Object o)メソッドを使用して、コレクション内の特定のオブジェクトの出現を取得します。

于 2012-08-05T16:09:07.147 に答える
0

参照ヒストグラムを作成する簡単な方法の1つは、最初に入力データをリストに収集することです。各整数のカウントを集計する準備ができたら、最初にリストを並べ替え、次にリストを繰り返し、値が変化するたびにカウントを追跡してマップに出力します。あなたの最高の数を追跡します。そのマップが組み立てられると、あなたの答えは、それに一致する値のリストを返すそのカウントによる単純なルックアップです。

Map<Integer,List<Integer>> countedIntegers=new HashMap<Integer,List<Integer>>();
于 2012-08-05T16:07:09.750 に答える
0

入力された数値ごとに出現回数を追跡する必要があることを考えると、entered_number(key) から number_of_occurrences(value) へのマップが必要です。

number_of_occurrences をキーとして使用する場合、入力された数値の出現回数が変わるたびに、キーを削除して、増分を加えて再度追加する必要があります。入力された数値の総数の半分に対してこれを行うと仮定すると、ヒープのようなデータ構造を使用すると、O(n/2 * logn) = O(nlogn) の複雑さになります。

入力された_number(キー)と出現回数(値)を格納する標準のマップデータ構造(たとえばHashMap)を使用する場合、最後の反復によって与えられるO(n)の複雑さになります。最初に出現の最大数を見つけてから、その頻度を持つ入力されたすべての数値を取得する必要があります。というわけで、この第 2 版をお勧めします。

于 2012-08-05T15:13:21.903 に答える