选择排序-数组列表



基本上,我有几个人的数据包含在一个.csv文件中。这个电子表格文件在一列中包含人名,在另外两列中包含年龄和工作经验。

到目前为止,我已经成功地在文本区域中显示了数据。但是,我希望能够按姓名的字母顺序组织人员,或者当用户单击两个按钮中的一个时,按年龄升序组织人员。对于本例,我试图通过按年龄排序来限制复杂度。

我被告知,为了做到这一点,我应该使用选择排序算法。不幸的是,我只对数组使用了选择排序,而不是arrayLists,也不是存储在.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循环是否正确?

提前感谢。

把整个程序贴出来不是问问题的好方法。

看看教科书在做什么。它循环遍历数组,将每个数组与"array [minPos]"项进行比较。如果新元素更小,它就变成新的minPos。最后,我们知道它是最小的元素,并把它推到列表的最前面。

在你的例子中,你正在使用一个ArrayList,如果你调用get(index),它会给你它的存储对象(一个People对象),然后它可以告诉你它的agename,希望。(您没有向我们展示这个People类,所以我们不知道它的访问器是什么样子的。)你可以比较一下。要确定哪个是最小的

基本上你可以把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;
  } 
} 

相关内容

  • 没有找到相关文章

最新更新