我的类有一个赋值,用于对我们之前使用insert sort方法创建的LinkedList进行排序。我们通过阅读列出了5个贡献者的excel文件创建了List。我意识到这听起来像是一个重复的问题...但是,我能找到的所有样本都处理整数或数组,没有什么我可以找到处理字符串或者像我正在使用的LinkedList。另一个问题,我确实发现处理不仅仅是整数的例子假设你从头开始制作列表"使用Head和Node等类似的东西...正如你在我的代码中看到的那样,我没有从头开始制作我的,我只是使用Java实用程序中的构建来制作我的。无论如何,我的代码可能效率不高,但到目前为止我的每项任务都得到100分,所以我觉得它对学校来说已经足够好了,但是也欢迎任何改善它的建议。我是编程的初学者,只有以前上课的经验。所以,这是我的代码:
import java.io.*;
import java.util.*;
public class ChrisJohnson_Unit3_IP {
static class Contributor{ //create class to store contributor information
//declare variables
private String firstName;
private String lastName;
private String country;
private String phone;
private double contribution;
private int id;
//methods for setting variable values
public String getFirstName(){
return firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getLastName(){
return lastName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public String getCountry(){
return country;
}
public void setCountry(String country){
this.country = country;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone){
this.phone = phone;
}
public double getContribution(){
return contribution;
}
public void setContribution(double contribution){
this.contribution = contribution;
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public void Print(){//method to print class objects
System.out.printf("%-10s %-10s %-8s %-15s %s %-15s %d %n", firstName, lastName, country,
phone, "$", contribution, id);
}
}//end Contributor class
static LinkedList contributorList = new LinkedList(); //create new Contributor Linked List
static Hashtable<String, Contributor> memberID = new Hashtable<>();//create new Hash Table
public static void main(String[] arg) throws Exception {
String response;
String ID;
Contributor contributorData = null;
Scanner in = new Scanner(System.in);
//print Welcome message and describe program to user
System.out.println("Welcome! This program will read your contributors.csv file "
+ "and store it into a list. \nTThe program will then sort the list and"
+ "print it for you to view/n");
System.out.println("Press enter to read the currently saved contributors.csv file...");
in.nextLine();
BufferedReader File =
new BufferedReader(new FileReader("contributors.csv"));
String dataRow = File.readLine(); // Read first line.
// The while checks to see if the data is null. If
// it is, end of file has been reached. If not,
// data will be processed.
while (dataRow != null){//While to read contributors.csv file and store in Contributor object
String[] data = dataRow.split(",");
contributorData = new Contributor(); //create new Contributor object
//store data into Contributor object
contributorData.setFirstName(data[0]);
contributorData.setLastName(data[1]);
contributorData.setCountry(data[2]);
contributorData.setPhone(data[3]);
contributorData.setContribution(Double.parseDouble(data[4]));
contributorData.setId(Integer.parseInt(data[5]));
ID = Integer.toString(contributorData.getId());
contributorList.push(contributorData);//add object to top of contributorList
memberID.put(ID,contributorData);//add contributor ID to key element of Hash Table
dataRow = File.readLine(); // Read next line of data.
}//end While to read contributors.csv file
File.close();//close CSV file
System.out.println("Here is your unsorted contributor list:\n");
//call Print method to print the list
System.out.printf("%-10s %-10s %-8s %-15s %-17s %s %n", "First", "Last",
"Country", "Phone #", "Contribution", "ID");
Iterator<Contributor> iter = contributorList.iterator();
while(iter.hasNext()){
iter.next().Print();
}//end while
System.out.println("Thank you for using this program!");
} //main()
}//end ChrisJohnson_Unit3_IP class
同样,List必须使用insert排序方法按名称排序。我理解sort方法的基本概念,但老老实实地不知道如何在这里实现它。我不是在寻找别人为我做功课,只是给我一个正确的方向。任何帮助将不胜感激,如果您需要更多信息,请告诉我。这项任务将于周一到期,所以希望有人能够在那时帮助我。是的,我已经写了我的导师寻求帮助,我整个星期一直在外面,所以我一直在努力追赶。感谢您抽出宝贵时间阅读我的问题
答案 0 :(得分:1)
首先,我应该说在链表上进行插入排序是完全没有意义的。其次,你可以做类似下面这样的事情,如果你添加一个getName方法来连接贡献者的名字和姓氏(你可以在排序时连接,但你的代码会更乱)。
@microposts
答案 1 :(得分:1)
首先更改您的contributorList
以使用其拥有的对象的通用类型。那是LinkedList<Contributor>
;。第二次更改Object以实现Comparable
。那是class Contributor implements Comparable<Contributor>
并实现方法public int compareTo(Contributor other)
。第三,选择一种排序方法并使用compareTo
来实现它,以比较对象进行排序。
答案 2 :(得分:0)
使用ListIterator
找到插入元素和插入的正确位置。这使得您可以比使用标准方法&#34;更有效地进行插入排序,该方法将在O(n³)
中运行,因为get
和set
在{{1}中运行索引O(i)
。 (内部循环将在i
中运行,因为O(i²)
和O(1+2+...+i) = O(i²)
)。
请注意,using a Iterator
足以在O(1²+2²+...+n²) = O(n³)
中找到插入点并实现O(n)
运行时间,但使用O(n²)
可以查找和插入元素as如果以一种聪明的方式使用,只删除外部循环迭代的下一次迭代的元素,只需要一个迭代器。
使用Comparator
按指定标准比较对象还允许您指定要按以下排序的标准:
ListIterator
在java 8中,您可以轻松创建return value of comparator.compare(a, b) | meaning
-----------------------------------------------------------
0 | a == b
> 0 | a > b
< 0 | a < b
给定对方法的方法引用,该方法返回给定对象的排序条件:
Comparator
不使用方法引用,可以使用实现Comparable
接口的对象的Comparator<Contributor> comparator = Comparator.comparing(Contributor::getLastName);
来完成,例如compareTo
:
String
这样您可以使用the Strategy Pattern作为排序关系,允许您通过传递不同的Comparator<Contributor> comparator = new Comparator<Contributor>() {
@Override
public int compare(Contributor o1, Contributor o2) {
return o1.getLastName().compareTo(o2.getLastName());
}
};
来使用不同的排序。它也是Comparator
类允许您使用任意内容对Collections
进行排序的方式,请参阅Collections.sort(List, Comparator)
。