2015-01-30 2 views
-2

Практически с этой программой, но когда он отсортирован, вес устраивается от наименьшего до наибольшего, что является правильным. Единственная проблема заключается в том, что имя и возраст, связанные с весом, не сортируются с весом.Как отсортировать список от наименьшего до наибольшего

, например

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"); 
     } 
    } 
} 

} 
+5

Почему бы не создать объект Person и не сделать метод Comparable? –

+1

Вы должны, вероятно, указать, что именно было назначено. Лично я бы создал единый список объектов Person и сортировал его, вместо того, чтобы использовать три отдельных списка, но это может быть не то, о чем ваше задание, так что, пожалуйста, сообщите нам об этом. – RealSkeptic

+0

Мы должны использовать массив для назначения, чтобы перечислить предоставленную информацию. – Loraine

ответ

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; 
    } 
} 

Ваша первая проблема заключается в: Если два или более лиц, имеющих один и тот же вес, что вы не найдете четко отношения. (Не в тему вашего вопроса, но проблема.)

Ваша secound проблема заключается в: (. Если все веса различны)

Collections.sort(Weight); 

Этот метод сортирует список 'Вес'. Но это тот же список с именем «WeightList». Вы копируете ссылку.

Сначала вы клонируете список, но вы используете сортировку.

И вам нужно изменить i и j в 'Name.set (...)' и 'Age.set (...)'.

Это должно помочь:

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 комментарий вашего qurestion. Лучше использовать класс для человека, который реализует интерфейс «Comparable».

Вы должны использовать компараторы, на мой взгляд. Это общий способ получения гибкости.