Java-приложение для сравнения методов сортировки


Меня попросили сделать приложения Java с главным классом В2.

Как я могу сделать это лучше и эффективнее?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

class Sort extends q2
{
    public static double SWITCH;
}
class q2 extends JFrame
{
    public static void main(String[] args)
    {
        q2 window = new q2();
        Container cont = window.getContentPane();
        window.setDefaultCloseOperation(EXIT_ON_CLOSE);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        window.setVisible(true);
        window.setSize(dim);
        JPanel LeftPanel = new JPanel();
        JPanel RightPanel = new JPanel();
        JPanel MiddlePanel = new JPanel();
        JPanel Middle1Panel =new JPanel();
        JPanel Middle2Panel = new JPanel();
        JPanel Middle3Panel = new JPanel();
        MiddlePanel.add(Middle1Panel);
        MiddlePanel.add(Middle2Panel);
        MiddlePanel.add(Middle3Panel);
        cont.setLayout(new GridLayout(1,3));
        cont.add(LeftPanel);
        cont.add(MiddlePanel);
        cont.add(RightPanel);
        LeftPanel.setBackground(Color.red);
        RightPanel.setBackground(Color.black);

        JRadioButton BubbleButton = new JRadioButton("BubbleSort");
        JRadioButton SelectionButton = new JRadioButton("SelectionSort");
        JRadioButton InsertionButton = new JRadioButton("InsertionSort");
        RightPanel.add(BubbleButton);
        RightPanel.add(SelectionButton);
        RightPanel.add(InsertionButton);
        ButtonGroup Group1 = new ButtonGroup();
        Group1.add(InsertionButton);
        Group1.add(SelectionButton);
        Group1.add(BubbleButton);

        BubbleButton.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e)
            {
                Sort.SWITCH = 1;
            }
        });
        SelectionButton.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e)
            {
                Sort.SWITCH = 2;
            }
        });
        InsertionButton.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e)
            {
                Sort.SWITCH = 3;
            }
        });

        LeftPanel.setLayout(new GridLayout(2,1));
        JPanel VariablePanel = new JPanel();
        JPanel ResultPanel = new JPanel();
        LeftPanel.add(VariablePanel);
        LeftPanel.add(ResultPanel);
        VariablePanel.setLayout(new GridLayout(10,1));
        final JTextField [] VarField = new JTextField[20];
        for(int q=0;q<10;q++)
        {
            VarField[q] = new JTextField();
            VariablePanel.add(VarField[q]);
        }

        ResultPanel.setBackground(Color.black);
        ResultPanel.setLayout(new GridLayout(10,10));
        JButton SortButton = new JButton("Sort");
        ResultPanel.add(SortButton);

        Middle1Panel.setLayout(new GridLayout(4,2));

        final JTextField Output = new JTextField(50);
        Output.setText("OutputMinute");
        ResultPanel.add(Output);

        JLabel Min = new JLabel("Min");
        Middle1Panel.add(Min);
        final JTextField OutputMin = new JTextField(50);
        Output.setText("OutputSecond");
        Middle1Panel.add(OutputMin);
        JLabel Sec = new JLabel("Sec");
        Middle1Panel.add(Sec);
        final JTextField OutputSec = new JTextField(50);
        Output.setText("Output");
        Middle1Panel.add(OutputSec);
        JLabel Mill = new JLabel("Millisec");
        Middle1Panel.add(Mill);
        final JTextField OutputMill = new JTextField(50);
        Output.setText("Output");
        Middle1Panel.add(OutputMill);
        JButton Randomise = new JButton("Randomise");
        Middle1Panel.add(Randomise);

        final Random randomise = new Random();
        Randomise.addActionListener(new ActionListener()  {
            public void actionPerformed(ActionEvent a)
            {
                for(int q=0;q<=9;q++)
                {
                    VarField[q].setText(Integer.toString(randomise.nextInt()));
                }
            }
        });

        SortButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent a)
            {
                if (Sort.SWITCH == 1)
                {
                    Calendar bubblestart = Calendar.getInstance();
                    int w,mindiff,secdiff,millsecdiff,q;
                    int[] i =new int[10];
                    for(q=0;q<10;q++)
                    {
                        i[q]=Integer.parseInt(VarField[q].getText());
                    }
                    while (q != 0)
                    {
                        q=0;
                        for(int r=0;r<=8;r++)
                        {
                            if (i[r]>i[r+1])
                            {
                                q=1;
                                w=i[r];
                                i[r]=i[r+1];
                                i[r+1]=w;
                            }
                        }
                    }

                    Calendar bubbleend = Calendar.getInstance();
                    Output.setText(Integer.toString(i[0])+" "+Integer.toString(i[1])+" "+Integer.toString(i[2])+" "+Integer.toString(i[3])+" "+Integer.toString(i[4])+" "+Integer.toString(i[5])+" "+Integer.toString(i[6])+" "+Integer.toString(i[7])+" "+Integer.toString(i[8])+" "+Integer.toString(i[9]));
                    mindiff=bubbleend.get(Calendar.MINUTE)-bubblestart.get(Calendar.MINUTE);
                    secdiff=bubbleend.get(Calendar.SECOND)-bubblestart.get(Calendar.SECOND);
                    millsecdiff=bubbleend.get(Calendar.MILLISECOND)-bubblestart.get(Calendar.MILLISECOND);
                    OutputMin.setText(Integer.toString(mindiff));
                    OutputSec.setText(Integer.toString(secdiff));
                    OutputMill.setText(Integer.toString(millsecdiff));
                }
                else if (Sort.SWITCH == 2)
                {
                    Calendar selectstart = Calendar.getInstance();
                    int w,serial=0,mindiff,secdiff,millsecdiff,q;
                    int[] i =new int[10];
                    for(q=0;q<10;q++)
                    {
                        i[q]=Integer.parseInt(VarField[q].getText());
                    }
                    for (q=0;q<9;q++)
                    {
                        w=i[q];
                        for(int r=q;r<=9;r++)
                        {
                            if(i[r]<w)
                            {
                                w=i[r];
                                serial=r;
                            }
                        }
                        if(i[q]!=w)
                        {
                            w=i[q];
                            i[q]=i[serial];
                            i[serial]=w;
                        }
                    }
                    Calendar selectend = Calendar.getInstance();
                    Output.setText(Integer.toString(i[0])+" "+Integer.toString(i[1])+" "+Integer.toString(i[2])+" "+Integer.toString(i[3])+" "+Integer.toString(i[4])+" "+Integer.toString(i[5])+" "+Integer.toString(i[6])+" "+Integer.toString(i[7])+" "+Integer.toString(i[8])+" "+Integer.toString(i[9]));
                    mindiff=selectend.get(Calendar.MINUTE)-selectstart.get(Calendar.MINUTE);
                    secdiff=selectend.get(Calendar.SECOND)-selectstart.get(Calendar.SECOND);
                    millsecdiff=selectend.get(Calendar.MILLISECOND)-selectstart.get(Calendar.MILLISECOND);
                    OutputMin.setText(Integer.toString(mindiff));
                    OutputSec.setText(Integer.toString(secdiff));
                    OutputMill.setText(Integer.toString(millsecdiff));
                }
                else if (Sort.SWITCH == 3)
                {
                    Calendar insertstart = Calendar.getInstance();
                    int q,mindiff,secdiff,millsecdiff,loop1,loop2,temp1,temp2=0;
                    int[] i =new int[10];
                    for(q=0;q<10;q++)
                    {
                        i[q]=Integer.parseInt(VarField[q].getText());
                    }
                    for(loop1=1;loop1<=9;loop1++)
                    {
                        int in, out;
                        for(out=1; out<10; out++)
                        {
                            int temp = i[out];
                            in = out;
                            while(in>0 && i[in-1] >= temp)
                            {
                                i[in] = i[in-1];
                                --in;
                            }
                            i[in] = temp;
                        }
                    }
                    Calendar insertend = Calendar.getInstance();
                    Output.setText(Integer.toString(i[0])+" "+Integer.toString(i[1])+" "+Integer.toString(i[2])+" "+Integer.toString(i[3])+" "+Integer.toString(i[4])+" "+Integer.toString(i[5])+" "+Integer.toString(i[6])+" "+Integer.toString(i[7])+"      "+Integer.toString(i[8])+" "+Integer.toString(i[9]));
                    mindiff=insertend.get(Calendar.MINUTE)-insertstart.get(Calendar.MINUTE);
                    secdiff=insertend.get(Calendar.SECOND)-insertstart.get(Calendar.SECOND);
                    millsecdiff=insertend.get(Calendar.MILLISECOND)-insertstart.get(Calendar.MILLISECOND);
                    OutputMin.setText(Integer.toString(mindiff));
                    OutputSec.setText(Integer.toString(secdiff));
                    OutputMill.setText(Integer.toString(millsecdiff));
                }
                else
                {
                    Output.setText("Select a Sorting method");
                }
            }
        });
    }
}


964
2
задан 5 августа 2011 в 03:08 Источник Поделиться
Комментарии
2 ответа

Если вы абсолютно должны держать все в главном, это должно, вероятно, быть разделен на несколько отдельных функций. По крайней мере, я думаю:


  1. Одну функцию для пользовательского интерфейса.

  2. Одну функцию для каждого рода.

  3. Одну функцию для рандомизации данных.

Если бы это зависело от меня, я думаю, что я разделю его немного больше, чем это, с одной функцией для создания пользовательского интерфейса, и отдельный для обновления пользовательского интерфейса с результатами. В реальности, большое создание UI тоже практически идентичный код повторяется три раза, так что вы, вероятно, захотите разделить ее на пару частей, а также, с одним справиться только повторяющиеся части (которые вы можете позвонить три раза) а другой, который обрабатывает детали, которые не повторяются на кнопку.

Если вы хотите, чтобы это было приятнее с ОО точки зрения, вы могли бы пойти немного дальше, и определение рода интерфейс, а потом selectionSort, insertionSort и сортировать пузырьком каждого реализовать этот интерфейс. Сейчас у вас также есть практически идентичный код синхронизации в трех экземплярах (по одному для каждого вида); вы, наверное, будет лучше изолировать, что в одном месте, и применяя его в каждом роде, как вы запустите его.

7
ответ дан 6 августа 2011 в 01:08 Источник Поделиться

Пересмотр

Немного длиннее, но много более читабельным/выдвижная.

SortQ2Program.java

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class SortQ2Program implements Runnable {

@Override
public void run() {
JFrame frame = new JFrame();
frame.setContentPane(new SortQ2Panel());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new SortQ2Program());
}

}

SortQ2Panel.java

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class SortQ2Panel extends JPanel {

private static interface SortingAlgorithm {

public void sort(int[] values);

}

private static abstract class AbstractSortingAlgorithm
implements SortingAlgorithm {

protected void swap(int[] values, int aIndex, int bIndex) {
int temp = values[aIndex];
values[aIndex] = values[bIndex];
values[bIndex] = temp;
}

}

private static class BubbleSort extends AbstractSortingAlgorithm {

@Override
public void sort(int[] values) {
boolean isSorted = false;

while (!isSorted) {
isSorted = true;

for (int i = 0; i < N_VALUE_FIELDS - 1; ++i) {
if (values[i] > values[i + 1]) {
isSorted = false;
swap(values, i, i + 1);
}
}
}
}

}

private static class SelectionSort extends AbstractSortingAlgorithm {

@Override
public void sort(int[] values) {
for (int index = 0; index < N_VALUE_FIELDS; ++index) {
int minIndex = findMinIndex(values, index);

if (minIndex != index) {
swap(values, index, minIndex);
}
}
}

private int findMinIndex(int[] values, int startIndex) {
int minIndex = startIndex;

for (int index = startIndex; index < N_VALUE_FIELDS; ++index) {
if (values[index] < minIndex) {
minIndex = index;
}
}

return minIndex;
}

}

private static class InsertionSort extends AbstractSortingAlgorithm {

@Override
public void sort(int[] values) {
for (int index = 0; index < N_VALUE_FIELDS; ++index) {
int insertionValue = values[index];
int insertionIndex = findInsertionIndex(values, index,
insertionValue);
values[insertionIndex] = insertionValue;
}
}

private int findInsertionIndex(int[] values, int startIndex,
int value) {
int result;

for (result = startIndex;
result > 0 && values[result - 1] > value; --result) {
values[result] = values[result - 1];
}

return result;
}

}

private static final long serialVersionUID = 1L;

private static final int ROWS = 1;
private static final int COLS = 3;

private static final int N_VALUE_FIELDS = 10;

private static final int OUTPUT_ROWS = 2;
private static final int OUTPUT_COLS = 50;

private static final int LEFT_PANEL_ROWS = 2;

private static final int MIDDLE_PANEL_ROWS = 4;

private static final int MIDDLE_PANEL_COLS = 2;

private static final int RESULT_PANEL_ROWS = 2;

@SuppressWarnings("serial")
private static final Map<String, SortingAlgorithm> SORTING_MAP =
new HashMap<String, SortingAlgorithm>() {{
put("BubbleSort", new BubbleSort());
put("SelectionSort", new SelectionSort());
put("InsertionSort", new InsertionSort());
}};

private static final Random RANDOM_NUMBER_GENERATOR = new Random();

private ButtonGroup mSortGroup = new ButtonGroup();

private JTextField[] mNumFields = new JTextField[N_VALUE_FIELDS];

private JTextArea mOutputField = new JTextArea("Output", OUTPUT_ROWS, OUTPUT_COLS);

private JTextField mOutputMinField = new JTextField("OutputMin",
OUTPUT_COLS);
private JTextField mOutputSecField = new JTextField("OutputSec",
OUTPUT_COLS);
private JTextField mOutputMillisecField = new JTextField("OutputMil",
OUTPUT_COLS);

public SortQ2Panel() {
super(new GridLayout(ROWS, COLS));
initComponents();
}

@Override
public Dimension getPreferredSize() {
return Toolkit.getDefaultToolkit().getScreenSize();
}

private void initComponents() {
mOutputField.setLineWrap(true);
initLeftPanel();
initMiddlePanel();
initRightPanel();
}

private void initLeftPanel() {
JPanel leftPanel = new JPanel(new GridLayout(LEFT_PANEL_ROWS, 1));
leftPanel.setBackground(Color.RED);
leftPanel.add(initNumPanel());
leftPanel.add(initResultPanel());
add(leftPanel);
}

private void initMiddlePanel() {
JPanel middlePanel = new JPanel(
new GridLayout(MIDDLE_PANEL_ROWS, MIDDLE_PANEL_COLS));
middlePanel.add(new JLabel("Min"));
middlePanel.add(mOutputMinField);
middlePanel.add(new JLabel("Sec"));
middlePanel.add(mOutputSecField);
middlePanel.add(new JLabel("Millisec"));
middlePanel.add(mOutputMillisecField);

JButton randomiseButton = new JButton("Randomise");
randomiseButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
for (JTextField numField : mNumFields) {
int randInt = RANDOM_NUMBER_GENERATOR.nextInt();
numField.setText(String.valueOf(randInt));
}
}

});

middlePanel.add(randomiseButton);
add(middlePanel);
}

private void initRightPanel() {
JPanel radioPanel = new JPanel();
radioPanel.setBackground(Color.BLACK);

for (String buttonName : SORTING_MAP.keySet()) {
JRadioButton button = new JRadioButton(buttonName);
button.setActionCommand(buttonName);
button.setForeground(Color.WHITE);
mSortGroup.add(button);
radioPanel.add(button);
}

add(radioPanel);
}

private JPanel initNumPanel() {
JPanel numPanel = new JPanel(new GridLayout(N_VALUE_FIELDS, 1));

for (int count = 0; count < N_VALUE_FIELDS; ++count) {
mNumFields[count] = new JTextField();
mNumFields[count].setEditable(false);
numPanel.add(mNumFields[count]);
}

return numPanel;
}

private JPanel initResultPanel() {
JPanel resultPanel = new JPanel(new GridLayout(RESULT_PANEL_ROWS, 1));
resultPanel.setBackground(Color.BLACK);
resultPanel.add(initSortButton());
resultPanel.add(mOutputField);
return resultPanel;
}

private JButton initSortButton() {
JButton sortButton = new JButton("Sort");

sortButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
long start = System.currentTimeMillis();
int[] values = parseValues();
String sortType =
mSortGroup.getSelection().getActionCommand();
SORTING_MAP.get(sortType).sort(values);
long diff = System.currentTimeMillis() - start;
outputValues(values);
outputTime(diff);
}

});

return sortButton;
}

private int[] parseValues() {
int[] values = new int[N_VALUE_FIELDS];

for (int index = 0; index < N_VALUE_FIELDS; ++index) {
values[index] = Integer.parseInt(mNumFields[index].getText());
}

return values;
}

private void outputValues(int[] values) {
String output = "";

for (int value : values) {
output += String.valueOf(value) + " ";
}

mOutputField.setText(output);
}

private void outputTime(long time) {
long min = TimeUnit.MILLISECONDS.toMinutes(time);
long sec = TimeUnit.MILLISECONDS.toSeconds(time) -
TimeUnit.MINUTES.toSeconds(min);
long millisec = time - TimeUnit.SECONDS.toMillis(sec);

mOutputMinField.setText(String.valueOf(min));
mOutputSecField.setText(String.valueOf(sec));
mOutputMillisecField.setText(String.valueOf(millisec));
}

}

Дизайн Банкноты


  • функцию setvisible должна быть последняя вещь, которая называется в вашей программе. Прежде чем я переехал его до конца, ваша программа просто показали, как большой пустой.

  • Имена классов для Java следует в UpperCamelCase.

  • Имена переменных для Java должен быть lowerCamelCase.

  • Вам не надо подкласс вашего главного класса, чтобы добавить константу, вы все равно в основном классе. Поставить постоянный в основном классе.

  • Не используйте равна сравнении с дублями. Я думаю, что вы собирались с переключателем переменной является перечисление

  • Не использовать подстановочные импорта как класса javax.качели.*. Это загрязняет пространство имен. Вместо того, чтобы импортировать отдельные классы.

  • Не подкласс форму. Вместо jpanel у подкласса и сделать отдельный класс, который содержит метод main. Инициализировать старые форму и поставь в область контента на пользовательские панели.

  • Все графические код должен быть внутри метода swingutilities.invokeLater(Runnable в). Что ставит его на потоке диспетчеризации события AWT.

    Из солнечных нитей и качели статье:


    Как только качели компонент был реализован, все кода, которые могут влиять или зависеть от состояния этого компонента должна быть выполнена в потока диспетчеризации событий.

  • Все методы должны быть короткими, в том числе главного. Я ненавижу правила, как 15 строк или менее, но в основном рассматривать ваш код, как ребенок: если он пахнет его изменить.

  • SLVNAHTR (одной переменной буквы имена трудно читать)

  • Переменные должны иметь одну цель и только с одной целью.

  • частная статические заключительные инт NUMBER_OF_WAYS_MAGIC_NUMBERS_SUCK = 800;
    частная статические заключительные строки константы = "лучше";

  • Сухой код-это хороший код.

  • Я использовал стратегию шаблон дизайна, чтобы упростить вам сложным, если заявление. Теперь вы можете легко добавить новый алгоритм сортировки, если вы хотите. Просто расширить AbstractSortingAlgorithm и добавить новый алгоритм SORTING_MAP.

  • Системы.currentTimeMillis или системы.nanoTime обычно используется для синхронизации вещи.

  • Избавиться от неиспользуемых переменных. Если вы пытаетесь изменить макет содержимого панели, использовать соответствующий макет менеджеров

  • Мой рефакторинг целенаправленно неполным. Он отчаянно нуждается в комментариях, некоторые из имен переменных может быть лучше, программа немного бесполезны, и общий вид интерфейса нелепый. Это до вас, чтобы исправить это.

2
ответ дан 5 июля 2012 в 11:07 Источник Поделиться