专业治疗选择困难症----帮你做选择

很多时候都会遇到让人纠结的事情,比如做什么了不做什么的了。都说抛硬币很有效,并不是因为抛硬币的结果,而是在硬币抛出的那一瞬间,心中到底想要什么就已经很明显了。但是咧,不可能随身都带着一枚硬币吧。于是有了下面的这个小小的软件。


核心算法

哈,这里并不能说是核心算法吧。毕竟不是自己的。就是一个产生随机数的算法。让我们来追踪一下吧。

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

这样,我们就追踪完成了,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();

    }

}

回头总结

这里实现的逻辑还是比较清晰的,由于代码量很小。所以没有进行分层,而且很多重复的代码没有抽取到一个方法中,这是不好的地方,希望大家不要这么做,尽量的以面向对象的思想进行模块化的编程。

然后就是展望吧。其实这个程序中有很多的地方可以进行完善的,比如说在添加菜单项的时候我们可能不想一个一个的进行添加。我们就可以使用一个文件选择器,来从一个本地的文件中进行读取嘛。XML文件或者是文本文件或者是数据库中啊网络上啊什么的都是可以的,所以这样一来就需要写好较为底层的DAO层处理了。实现起来也不会很难。

程序运行结果展示



时间: 2024-08-29 13:05:35

专业治疗选择困难症----帮你做选择的相关文章

让SCv2000来拯救企业存储的选择困难症

    十二星座中的天秤座,常被调侃自带"选择困难症"属性,然而仔细一想,谁还没个选择困难的时候.比如:中午吃米饭or面条.打车or坐公交.买最新款or经典款--对于企业存储采购来说,选择至关重要,考虑诸多因素还是难以定夺,如何是好? 企业存储采购人员几乎都在选择时纠结过,选择成本低的or服务范围全的?按每个用户计划or按年计划来购买存储容量?选择老牌服务商or行业新秀--各种各样的权衡因素快把采购人员逼成天秤座了-- 选择困难,多是出于对性价比的衡量.根据中桥2015年最新调研数据显

该买 Playstation 4 还是 Xbox One?选择困难症患者专贴

class="post_content" itemprop="articleBody"> 自从 Xbox One 正式发布以来,就一直被拿来和 PS4 比较,现在距离 2 部次时代主机正式发售的日子越来越近,相信不少机迷非常期待,但每逢这些时候选择困难症总会发作,假若你还在烦恼买哪一部,就让小编帮你每个重点逐一分析-- PS4 vs. Xbox One 第一回合:游戏篇 游戏机当然主要用来玩游戏,两部主机各自有一些独占游戏,而玩家往往凭着游戏而决定买哪一部主机

云计算让中小企业不再选择困难症

中小企业曾经对于自己无法支付所需要的IT服务的担心因为云计算的出现而消失无踪,甚至就连小型酒厂也已经可以享受IT服务.IDC研究所的分析师Lan Song认为:企业为了使用终端市场的SaaS解决方案的就要做出权衡:客户通常只能接受比较通用的方案,但是向某些特定行业提供解决方案的提供商也很少.但如果这些企业转而选择定制解决方案,成本的大幅度提高显然是不划算的. 成本和的定制的选择对于用户来说是相当困难的.成立三年的葡萄酒管理系统( Wine Management Systems (WMS))的CE

一篇文读懂19款数据分析软件,解救选择困难症!

作者介绍 欧阳辰,超过15年的软件开发和设计经验,目前就职于小米公司,负责小米广告平台的架构研发.曾为微软公司工作10年,担任高级软件开发主管.热爱架构设计和高可用性系统,特别对于大规模互联网软件的开发,具有丰富的理论知识和实践经验.个人公众号:互联居.   数据分析(Data Analytics)从来都不是一个寂寞的领域,每一个时代都赋予其新的内容.在大数据盛行之时,各种大数据分析软件如雨后春笋一般涌现出来,整个市场一片繁花似锦.欣欣向荣.本篇文章主要介绍一些常用的大数据分析软件,帮助大家望尽

选择综合症最爱帮我做决定应用

帮我做决定天秤座的人天生都有选择综合症.有时候面前呈现太多的选择,反而让人头疼,不知如何选择,举棋不定--这时候,"帮我做决定"这款简单方便的选择工具就能帮你在很多纠结的情况下做出决定.坐动车还是坐飞机?买什福特还是大众?两份条件相当的工作,选择哪一家?偶遇中意的情人,是否要上前搭讪?帮我做决定不仅仅这些,朋友聚餐去哪家餐厅吃?谁来买单?无论大事小情,只需选择 just spin 模式轻轻一转.看箭头指向谁,谁就是幸运儿啦.人生充满了选择.有了这款小应用,一切都变得简单!推荐给选择恐惧

选择恐惧症

事实上,选择恐惧症的表现就是在当你需要对一件事做出选择的时候,当事者会左右摇摆.患得患失.瞻前顾后.纠结选择,导致在很长时间内做不出最终决定,更有可能在决定后会后悔. 选择恐惧症也叫做选择困难症,从心理学来说,是一种很普遍的心理亚健康或者心理疾病状态.我们大部分的人,多多少少,在一定程度上都有选择困难的情况出现,例如: 1.公司的总裁在任命某个总经理犹豫不决的时候:是选择业务能力很强但偏保守小李呢还是选择年轻一些经验不足但是更有闯劲的小张呢-- 2.一个女白领在商场里挑选裙子:是选择长款的,还是

产品经理的选择困难

摘要: 在本文正式开始之前,先给大家进行一个小测试,请看下图并回答:如果是男人,你会喜欢哪一种类型的女友?如果是女人,你结婚会选择哪款婚纱? 如果在一分钟之内还没有明确并给出 在本文正式开始之前,先给大家进行一个小测试,请看下图并回答:如果是男人,你会喜欢哪一种类型的女友?如果是女人,你结婚会选择哪款婚纱? 如果在一分钟之内还没有明确并给出你的答案,那么有理由怀疑你可能有轻微的选择恐惧症.如果在半小时之内还在纠结的话,那么建议你直接找专业的医生去咨询一下关于这方面的问题(真心但愿不会). 通过这

选择性网站“Bbask”解决“选择恐惧症”

网站截图 平常在家谁做家务?同事一起谁请客?玩真心话大冒险,不知道问什么?用网站的"判断"来决定是谁!一个名为"Bbask"的新鲜网站(网站地址:http://www.bbask.com/)帮你解决问题.网站的功能其实并不太多,总共就五个选项,"真心话大冒险""家务骰子""AA制""山寨大全"和"家庭医生",但每个选项里都是生活中最要命的"选择恐惧症&quo

解救选择困难,Hadoop在线分析处理选型

文章讲的是解救选择困难,Hadoop在线分析处理选型,数据分析市场从来都很活跃,就好像随时随地都会诞生无数的新工具新技术新框架一样,其实无非就两种,充满了大鱼吃小鱼故事的商业软件市场和开源数据处理软件.在互联网精神和开源情怀的引导下,各种专业领域的开源软件日益壮大.百花齐放的情况下,到底要如何选择呢? Hadoop是一个非常好的数据存储平台.在开源世界,Hadoop将人们引入了大数据时代,处理TB级别的大数据成为一种可能,但实时性能一直是Hadoop的伤痛.直到14年,Spark横空出世,通过最