基本上,我有几个人的数据包含在一个.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
对象),然后它可以告诉你它的age
或name
,希望。(您没有向我们展示这个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;
}
}