2016-11-10 2 views
0

Напишите способ вернуть Игрушку, которая встречается в списке наиболее часто встречающихся и другой способ сортировки игрушек по счету.Сортировка объектов самого высокого уровня в Java с помощью ArrayList?

Это мой код

import java.util.ArrayList; 

public class ToyStore { 
    private ArrayList<Toy> toyList; 

    public ToyStore() { 
    } 

    public void loadToys(String toys) { 
     toyList = new ArrayList<Toy>(); 
     for (String item : toys.split(" ")) { 
      Toy t = getThatToy(item); 
      if (t == null) { 
       toyList.add(new Toy(item)); 
      } else { 
       t.setCount(t.getCount() + 1); 
      } 
     } 
    } 

    public Toy getThatToy(String nm) { 
     for (Toy item : toyList) { 
      if (item.getName().equals(nm)) { 
       return item; 
      } 
     } 
     return null; 
    } 

    public String getMostFrequentToy() { 
     int position = 0; 
     int maximum = Integer.MIN_VALUE; 
     for (int i = toyList.size() - 1; i >= 0; i--) { 
      if (toyList.get(i).getCount() > maximum) 
       maximum = toyList.get(i).getCount(); 
      position = i; 
     } 
     return toyList.get(position).getName(); 
    } 

    public void sortToysByCount() { 
     ArrayList<Toy> t = new ArrayList<Toy>(); 
     int count = 0; 
     int size = toyList.size(); 

     for (int i = size; i > 0; i--) { 
      t.add(new Toy(getMostFrequentToy())); 
      t.get(count).setCount(getThatToy(getMostFrequentToy()).getCount()); 
      toyList.remove(getThatToy(getMostFrequentToy())); 
      count++; 
     } 

     toyList = t; 
    } 

    public String toString() { 
     return toyList + "" + "\n" + "max == " + getMostFrequentToy(); 
    } 
} 

Вот метод, который я забочусь о

public void sortToysByCount() { 
    ArrayList<Toy> t = new ArrayList<Toy>(); 
    int count = 0; 
    int size = toyList.size(); 

    for (int i = size; i > 0; i--) { 
     t.add(new Toy(getMostFrequentToy())); 
     t.get(count).setCount(getThatToy(getMostFrequentToy()).getCount()); 
     toyList.remove(getThatToy(getMostFrequentToy())); 
     count++; 
    } 

    toyList = t; 
} 

Вот мой выход

[sorry 4, bat 1, train 2, teddy 2, ball 2] 

Вот что я хочу

[sorry 4, train 2, teddy 2, ball 2, bat 1]; 

Что не так в моем коде? Как мне это сделать?

+5

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

+0

Это похоже на домашнюю работу. Вот наша политика [о домашних заданиях] (http://meta.programmers.stackexchange.com/questions/6166/open-letter-to-students-with-homework-problems). –

ответ

1

Проблема заключается в методе getMostFrequentToy():

Заменить

 if (toyList.get(i).getCount() > maximum) 
      maximum = toyList.get(i).getCount(); 
     position = i; 

с

 if (toyList.get(i).getCount() > maximum) { 
      maximum = toyList.get(i).getCount(); 
      position = i; 
     } 

, потому что вы хотите, чтобы получить позицию, соответствующую этому максимуму.

0

У вас есть некоторые эффективные функции в вашем коде. Каждый раз, когда вы вызываете getMostFrequentToy(), вы выполняете итерирование по всему списку, что может быть хорошо, поскольку вы постоянно удаляете объекты, но вам действительно не нужно делать объекты new Toy для тех, которые уже существуют в списке.

Итак, это «лучше», но все же не уверен, что вам нужно getThatToy, когда вы уже должны знать, какой из них наиболее частый.

String frequent; 
for (int i = size; i > 0; i--) { 
    frequent = getMostFrequentToy(); 
    t.add(new Toy(frequent)); 
    t.get(count).setCount(getThatToy(frequent).getCount()); 
    toyList.remove(getThatToy(frequent)); 
    count++; 
} 

В любом случае, я думаю, что инструкции просил вас, чтобы вернуть объект игрушки, а не его имя.

Это довольно просто, просто отслеживайте максимальное количество.

public Toy getMostFrequentToy() { 
    Toy mostFrequent = null; 
    int maximum = Integer.MIN_VALUE; 

    for (Toy t : toyList) { 
     if (t.getCount() > maximum) 
      mostFrequent = t; 
    } 
    return t; 
} 

Теперь, приведенный выше код может стать

public void sortToysByCount() { 
    ArrayList<Toy> t = new ArrayList<Toy>(); 
    // int count = 0; 
    int size = toyList.size(); 

    Toy frequent; 
    for (int i = size; i > 0; i--) { 
     frequent = getMostFrequentToy(); 
     t.add(frequent); 
     // t.get(count).setCount(frequent.getCount()); // Not sure about this 
     toyList.remove(frequent); 
     // count++; 
    } 

    toyList.clear(); 
    toyList.addAll(t); 
} 

реалистически, хотя, если вы хотите отсортировать, вы действительно должны увидеть, как create a Comparator for your Toy objects.

Смежные вопросы