1. 程式人生 > >專業治療選擇困難癥----幫你做選擇

專業治療選擇困難癥----幫你做選擇

菜單項 自己 成了 append over 數據 tag util dap

很多時候都會遇到讓人糾結的事情,比如做什麽了不做什麽的了。都說拋硬幣很有效,並不是因為拋硬幣的結果,而是在硬幣拋出的那一瞬間,心中到底想要什麽就已經很明顯了。但是咧,不可能隨身都帶著一枚硬幣吧。於是有了下面的這個小小的軟件。


核心算法

哈,這裏並不能說是核心算法吧。畢竟不是自己的。就是一個產生隨機數的算法。讓我們來追蹤一下吧。

//第一步:入口之Math.random()
Math.random();
  • 1
  • 2
//第二步:進入random的內部
public static double random() {
        return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
    }
  • 1
  • 2
  • 3
  • 4
//第三步:深入下去
 public double nextDouble() {
        return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT;
    }
  • 1
  • 2
  • 3
  • 4
//第四步:繼續研究
  private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53)
  • 1
  • 2

這樣,我們就追蹤完成了,Java自帶的隨機算法的原理了吧。是的,就是這一些列的左移操作,使得我們可以如願獲得一個較為合理的隨機數。當然了,直接的隨機數是一個double類型的數據,我們不能直接進行使用,要進行相關的轉換才行。

這個小程序的思路

說是思路,其實也就是每一步都完成了些什麽。
這裏我使用了awt包來實現界面的搭建,然後使用了一個列表作為選項的容器,再加上一些自定義的方法來實現的。

功能描述:
在主界面可以進行獲取隨機結果,然後通過點擊添加按鈕進入到添加自定義的菜單的效果。添加的時候會置頂最新的選項,回車或者點擊添加按鈕都可以完成添加。點擊完成就可以回到主界面繼續幫你做選擇咯。

我的源碼

package tools;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import
java.awt.Font; import java.awt.Frame; import java.awt.Label; import java.awt.Panel; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; /** * 日期: 2016年5月6日9:36:53 * * 功能描述:一個簡單的Java AWT小程序,可以手動的添加可選項,隨機的幫助自己做出選擇 * * 算法:利用了Java自帶的隨機算法實現的對於列表List中元素的隨機選擇 * * @author Administrator * */ public class ChooseHelper { /** * 實現的思路: 首先是一個展示的主界面,用於展示結果以及用戶的交互操作,當點擊添加按鈕的時候會自動的彈出一個添加界面 * 在添加界面中,用戶既可以瀏覽到原有的選項,也可以實時的看到新添加的選項(這裏把新添加的選項置頂了,方便用戶觀察) * 在點擊“完成”按鈕後即可回到原主界面,進行新的隨機事件的結果獲取。 * * 註意: 這裏沒有采用分層的設計是因為,程序太小,分層的話顯得過於的繁瑣。 * 對於布局和各種偵聽事件的設置也沒有一個詳細的步驟,應該盡量的減少冗余代碼的存在。 */ public ChooseHelper() { Frame frame = new Frame(); frame.setTitle("幫我做選擇"); List<String> list = new ArrayList<String>(); list.add("再來一次!"); Label label = new Label("", Label.CENTER); label.setFont(new Font("Arial Bold", Font.ITALIC, 32)); label.setForeground(Color.decode("#00FFFF")); frame.setLayout(new BorderLayout()); frame.add(label, BorderLayout.CENTER); Panel panel = new Panel(new FlowLayout()); Button addItem = new Button("添加項"); Button doItem = new Button("隨機一下"); panel.add(addItem); panel.add(doItem); frame.add(panel, BorderLayout.SOUTH); frame.setVisible(true); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); /** * 點擊這個按鈕彈出一個添加備選項的界面 */ addItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Frame addFrame = new Frame(); addFrame.setTitle("添加備選項"); addFrame.setVisible(true); addFrame.setSize(400, 300); addFrame.setLocationRelativeTo(null); addFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { addFrame.setVisible(false); addFrame.dispose(); }; }); TextArea ta = new TextArea(); ta.setEditable(false); ta.setFocusable(false); refreshList(ta, list); addFrame.add(ta, BorderLayout.CENTER); Panel bottom = new Panel(new FlowLayout()); TextField tf = new TextField(28); Button addTf = new Button("添加這個內容"); Button complete = new Button("完成"); bottom.add(tf); bottom.add(addTf); bottom.add(complete); tf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String item = tf.getText().toString(); if (item != null && !item.equals("")) { list.add(0, item); tf.setText(""); refreshList(ta, list); } else { JOptionPane.showMessageDialog(null, "請輸入您要進行的活動!"); } } }); addFrame.add(bottom, BorderLayout.SOUTH); complete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addFrame.setVisible(false); addFrame.dispose(); } }); addTf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String item = tf.getText().toString(); if (item != null && !item.equals("")) { list.add(0, item); tf.setText(""); refreshList(ta, list); } else { JOptionPane.showMessageDialog(null, "請輸入您要進行的活動!"); } } }); } /** * 將刷新list的任務抽取出來,便於每一次的結果的刷新顯示。 * * @param ta * 用於顯示刷新後的結果 * @param list * 將list中的內容刷新到上面的容器TextArea中 */ private void refreshList(TextArea ta, List<String> list) { ta.setText(""); for (int i = 0; i < list.size(); i++) { ta.append(list.get(i) + "\n"); } } }); doItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int length = list.size(); label.setText(list.get((int) (Math.random() * length))); } }); } /** * 主程序的入口,測試一下程序的運行結果 * * @param args */ public static void main(String[] args) { ChooseHelper helper = new ChooseHelper(); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169

回頭總結

這裏實現的邏輯還是比較清晰的,由於代碼量很小。所以沒有進行分層,而且很多重復的代碼沒有抽取到一個方法中,這是不好的地方,希望大家不要這麽做,盡量的以面向對象的思想進行模塊化的編程。

然後就是展望吧。其實這個程序中有很多的地方可以進行完善的,比如說在添加菜單項的時候我們可能不想一個一個的進行添加。我們就可以使用一個文件選擇器,來從一個本地的文件中進行讀取嘛。XML文件或者是文本文件或者是數據庫中啊網絡上啊什麽的都是可以的,所以這樣一來就需要寫好較為底層的DAO層處理了。實現起來也不會很難。

程序運行結果展示

技術分享圖片
技術分享圖片
技術分享圖片

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

專業治療選擇困難癥----幫你做選擇