使用Java

时间:2016-09-03 10:32:27

标签: java sorting linked-list insertion-sort

我的类有一个赋值,用于对我们之前使用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方法的基本概念,但老老实实地不知道如何在这里实现它。我不是在寻找别人为我做功课,只是给我一个正确的方向。任何帮助将不胜感激,如果您需要更多信息,请告诉我。这项任务将于周一到期,所以希望有人能够在那时帮助我。是的,我已经写了我的导师寻求帮助,我整个星期一直在外面,所以我一直在努力追赶。感谢您抽出宝贵时间阅读我的问题

3 个答案:

答案 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³)中运行,因为getset在{{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)