如何从最小到最大排序列表

时间:2015-01-30 18:38:23

标签: java arrays collections

几乎完成了这个程序,但是当它被整理出来时,重量被安排为从最小到最大,这是正确的。唯一的问题是与重量相关的名称和年龄不按重量排序。

例如

mike 25 180          
jen  36 105      
sam  22 120

我应该

jen  36 105     
sam  22 120     
mike 25 180

但我得到

mike 25 105    
jen  36 120   
sam  22 180
import java.util.*;
import java.util.ArrayList;

import java.util.List;

public class Lab0 {


public static void main(String[] args) {

  //Scanner and variables  
  Scanner keyboard = new Scanner (System.in);
  String name = "";
  int age;
  double weight;
  int number;

  //Creates list for name, age, and weight
  ArrayList<String> Name = new ArrayList<String>();
  ArrayList<Integer> Age = new ArrayList<Integer>();
  ArrayList<Double> Weight = new ArrayList<Double>();

    System.out.println("Enter the information needed.");

    //Ask user to enter information needed
    while (true){
        System.out.print("Enter last name: ");
        name = keyboard.nextLine();

        if(name.equalsIgnoreCase("FINISHED")){
            break;
        }
        else {
            Name.add(name);
            System.out.print("Enter age: "); 
            age = keyboard.nextInt();
            Age.add(age);
            System.out.print("Enter weight: ");
            weight = keyboard.nextDouble();
            Weight.add(weight);
            keyboard.nextLine();
            System.out.println("==========================================\n");

        }
    }

    //new list to sort weight and age and name
    ArrayList<String> NameList = Name;
    ArrayList<Integer> AgeList = Age;
    ArrayList<Double> WeightList = Weight;

    Collections.sort(Weight);
    for(int i=0; i<Weight.size(); i++){
        for (int j=0; j<Weight.size(); j++){
            if(WeightList.get(j) == Weight.get(i)){
                Name.set(j, NameList.get(i));
                Age.set(j, AgeList.get(i));
            }

            else;
        }
    }



    //prints out information entered
     for (int k=0; k<Weight.size(); k++){

         System.out.println("Name: " + Name.get(k) + " Age: " + Age.get(k)
         + " weight: " + Weight.get(k));
     }


     while (true){
         System.out.println("=============================================");
         System.out.print("Enter a last name that you listed: ");
         String Search = keyboard.next();

         int index = Name.indexOf(Search);
         if (index >=0){
             System.out.println("Age: " + Age.get(index));
             System.out.println("Weight: " + Weight.get(index));
         }
         else if(Search.equalsIgnoreCase ("DONE")){
             System.exit(0);
         }
         else{
             System.out.println("NOT FOUND");
         }
     }
}

}

1 个答案:

答案 0 :(得分:0)

问题是,单一信息之间的关系正在消失。 一个人是一个像(姓名,年龄,体重)的三重奏。

您有三个列表,在使用权重对列表进行排序后,您需要连接单个信息。

这是代码的问题部分:

ArrayList<String> NameList = Name;
ArrayList<Integer> AgeList = Age;
ArrayList<Double> WeightList = Weight;

Collections.sort(Weight);
for(int i=0; i<Weight.size(); i++){
    for (int j=0; j<Weight.size(); j++){
        if(WeightList.get(j) == Weight.get(i)){
            Name.set(j, NameList.get(i));
            Age.set(j, AgeList.get(i));
        }

        else;
    }
}

您的第一个问题是: 如果两个或更多人的体重相同,则找不到明确的关系。 (不是你问题的主题,而是一个问题。)

你的问题是: (如果所有权重都不同。)

Collections.sort(Weight);

此方法对列表'Weight'进行排序。 但它的名称为'WeightList'的列表相同。 你复制了参考文献。

首先克隆列表,然后再使用sort。

你需要在'Name.set(...)'和'Age.set(...)'中改变i和j。

这应该会有所帮助:

ArrayList<String> NameList = (ArrayList<String>) Name.clone();
ArrayList<Integer> AgeList = (ArrayList<Integer>) Age.clone();
ArrayList<Double> WeightList = (ArrayList<Double>) Weight.clone();

Collections.sort(Weight);
for (int i = 0; i < Weight.size(); i++) {
    for (int j = 0; j < Weight.size(); j++) {
        if (WeightList.get(j) == Weight.get(i)) {
            Name.set(i, NameList.get(j));
            Age.set(i, AgeList.get(j));
        }

        else
            ;
    }
}

我认为这是你问题的答案。

此外:

你应该考虑'ChrisForrence'对你的问题的评论。 对于实现“Comparable”接口的人来说,最好使用类。

我认为你应该使用比较器。 这是获得灵活性的一般方法。