选择排序 - arrayLists

时间:2011-09-19 07:45:52

标签: java

基本上,我有.csv文件中包含的几个人的数据。此电子表格文件包含一列中人员的姓名,以及其他两列中的年龄和工作经验。

到目前为止,我已正确设法在文本区域中显示数据。但是,我希望能够按用户的名字按字母顺序组织人员,或者当用户点击两个按钮中的一个时按年龄按升序排列。对于这个例子,我试图通过尝试按年龄排序来限制复杂性。

我被告知为了做到这一点,我应该使用选择排序算法。不幸的是,我只使用了数组的选择排序,而不是数组列表,而不是存储在.csv文件中的数据。

我遇到的问题是我不知道如何浏览数据(对于arrayLists),然后将最小位置重新分配给最小数字。请参阅 minimumPosition 方法。

 public class Inputs extends JFrame
 {
   ArrayList <People> pList = new ArrayList <People>();
   JButton   NameSortButton;
   JTextArea DisplayTextArea; 

String outputText = "";

public Inputs()
{
        // Construct the GUI
      class innerListener implements ActionListener
    {
        public void actionPerformed (ActionEvent myActionEvent)
        {
            if (myActionEvent.getSource() == AgeSortButton)
            {
                sortByAge();
            }
        }
    }

    ActionListener inListener = new innerListener();
    NameSortButton.addActionListener(inListener);
}



public void readPeopleData()
{
    FileReader reader = null;
    int lineNumber = 1;

    try
    {
        reader = new FileReader("People.csv");
        Scanner in = new Scanner(reader);

        while (in.hasNextLine())
        {
            String input = in.nextLine();
            String section[] = input.split(",");
            pList.add(new People(section[0], section[1], Integer.parseInt(section[2]), Integer.parseInt(section[3])));
            lineNumber++;
        }

        for (People p: pList)
        {
            String heading = "Name \tAge \tWork Experience";
            outputText     = outputText + p.getPersonName()  +
                                  "\t"  + p.getAge()         +
                                  "\t"  + p.getExperience();
            DisplayTextArea.setText(heading + outputText);
        }
    }

    catch(IOException error)
    {
        JOptionPane.showMessageDialog(null, "File not Found","Error" , JOptionPane.ERROR_MESSAGE );
    }
} //    public void readPatientData()

private void sortByAge()
{
    for (int i = 0; i < pList.size(); i++)
    {
        int minPos = minimumPosition(i);
        swap(minPos, i);
    }
    displayOutputs();

}

private int minimumPosition(int from)
{
    int minPos = from;

    for (int i = from + 1; i < pList.size(); i++)
    {
                        // ****** PROBLEM AREA ****** //
        // if (pList.get(i).getAge() < // NO IDEA)
                          {
               minPos = i;
           }

                       /* 
                       The text book sorted arrays by: 
                       for (int i = from + 1; i < array.length; i ++)
                             if (array[i] < array[minPos])
                              {
                                   minPos = i;
                              } 
                       */

    }
    return minPos;
}


private void swap(int i, int j)
{
    People temp = pList.get(i);
    pList.set(i, pList.get(j));
    pList.set(j, temp);
}

private void displayOutputs ()
{
    for(int j = 0; j < pList.size(); j++)
    {
         outputText = outputText    + pList.get(j).getPersonName()     +
                               "\t" + pList.get(j).getAge()         +
                               "\t" + pList.get(j).getExperience()  +

        DisplayTextArea.setText(outputText);
        System.out.println(outputText);
    }
}

public static void main (String args[])
{
} //    public static void main (String args[])

}

有人可以指出我正确的方向吗?如何将排序数据与未排序数据进行比较。此外,我的 for loops 是否正确?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

发布的整个程序不是提问的好方法。

看看教科书在做什么。它循环遍历数组,将每个数组与“Array [minPos]”项进行比较。如果新元素实际上更小,则它将成为新的minPos。最后,我们知道它是最小的元素,并将其推到列表的前面。

在您的情况下,您正在使用ArrayList,如果您调用People,它将为您提供其存储的对象(get(index)对象),然后可以告诉您age或者name,希望如此。 (你没有向我们展示这个People类,所以我们不知道它的访问器是什么样的。)你可以比较它们。确定哪个是最小的。

答案 1 :(得分:0)

基本上你可以将ArrayList视为一个数组,因为它是一个由数组支持的列表。

你的实施已经很好了。

而不是:

for (int i = from + 1; i < array.length; i ++) {
  if (array[i] < array[minPos]) {
    minPos = i;
  } 
}

您将使用列表操作替换数组访问:

for (int i = from + 1; i < pList.size(); i ++) {
  if ( pList.get(i).getAge() < pList.get(minPos ).getAge() ) {
    minPos = i;
  } 
}