ユーザーが数字を入力するときに、ユーザーがプログラムに入力した数字の出現回数を数えようとしています。それらはすべて整数です。これは 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);
}
}