2015-01-29 5 views
-3

Я работаю над заданием для курса программирования, за которым я следую, и я использую Список для хранения данных. Класс List:Как мне сделать список отсортированным?

public List() { 
    init(); 
} 

protected Node<E> first, current, last; 
public int numberOfNodes; 

public boolean isEmpty() { 
    return numberOfNodes == 0; 
} 

public List<E> init() { 
    numberOfNodes = 0; 
    first = current = last = null; 
    return this; 
} 

public int size() { 
    return numberOfNodes; 
} 

public List<E> insert(E d) { 
    E copy = (E)d.clone(); 
    if (isEmpty()) { 
     first = current = last = new Node(copy); 
     numberOfNodes += 1; 
     return this; 
    } 
    else{ 
     for (current = first; current != null; current = current.next){ 
      if(current.next== null){ 
       current.next = last = new Node(copy); 
       last.prior = current; 
       last.next = null; 
       numberOfNodes += 1; 
       return this; 
      } 
      else{ 
       Node<E> newNode = new Node(copy); 
       current.next.prior = newNode; 
       newNode.next = current.next; 
       newNode.prior = current; 
       current.next = newNode; 
       current = newNode; 
       numberOfNodes +=1; 
       return this; 
      } 
     } 
    } 
    return this; 
} 

public E retrieve() { 
    return (E) current.data.clone(); 
} 

public List<E> remove() {  
    if (isEmpty()){ 
     return init(); 
    } 
    else if (numberOfNodes == 1){ 
     return init(); 
    } 
    else if (current == first) { 
     first = current = current.next; 
     current.prior = null; 
     numberOfNodes -= 1; 
    } 
    else if (current == last) { 
     last = current = current.prior; 
     current.next = null; 
     numberOfNodes -= 1; 
    } 
    else { 
     current.prior.next = current.next; 
     current.next.prior = current.prior; 
     current = current.next; 
     numberOfNodes -= 1; 
    } 
    return this; 
} 

public boolean find(E d) { 
    current = first; 
    while((current!=null && !(d.compareTo(current.data)==0))){ 
     current=current.next; 
    } 
    if (current==null){ 
     return false; 
    }else{ 
     return true; 
    } 
} 

public boolean setFirst() { 
    if(isEmpty()){ 
     return false; 
    } 
    else{ 
     current = first; 
     return true; 
    } 
} 

public boolean setLast() { 
    if(isEmpty()){ 
     return false; 
    } 
    else{ 
     current = last; 
     return false; 
    } 
} 

public boolean getNext() { 
    if(isEmpty()||current == last){ 
     return false; 
    } 
    else{ 
     current = current.next; 
     return true; 
    } 
} 

public boolean getPrior() { 
    if(isEmpty()||current == first){ 
     return false; 
    } 
    else{ 
     current = current.prior; 
     return true; 
    } 
} 

public List<E> clone() { 
    List<E> clone; 
    try{ 
     clone = (List<E>)super.clone(); 
    } catch(CloneNotSupportedException e){ 
     throw new Error("This cannot be cloned!"); 
    } 
    clone.init(); 
    for(Node n = first; n != null; n = n.next){ 
     clone.insert((E)n.clone().data); 
    } 
    clone.numberOfNodes = this.numberOfNodes; 
    return clone; 
} 

Теперь задание, чтобы сделать список отсортированный список, сортировка элементов от большого к малому. Мне нужно сделать это в отдельном классе SortedList.

я отталкивался, но у меня действительно нет понятия о том, что делать дальше:

public class SortedList extends List implements Comparable { 
public int compareTo(Object o) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

} 

Я использую список в моей программе для двух разных объектов: Я использую список в моем Set классе , Множество представляет собой набор натуральных чисел. Например: {1,2,3,4,5} - множество.

Кроме того, я использую этот список в классе Table. Таблица состоит из переменных. Переменная состоит из ключа и значения. Ключ - это идентификатор (например, Alfa), а значением является Set {1,2,3}. Назначение - упорядочить элементы в списке от большого до малого.

Таким образом, SortedList должен быть отдельным классом, который расширяет класс списка! Как я могу это сделать? Большое большое спасибо!

+0

, какой элемент вы хотите быть отсортирован? –

+2

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

+0

Я использую список в своей программе для двух разных объектов: Я использую список в своем классе Set. Множество представляет собой набор натуральных чисел. Например: {1,2,3,4,5} - множество. Кроме того, я использую этот список в своем классе Table. Таблица состоит из переменных. Переменная состоит из ключа и значения. Ключ - это идентификатор (например, Alfa), а значением является Set {1,2,3}. Назначение - упорядочить элементы в списке от большого до малого. Как я могу это сделать? Большое большое спасибо! –

ответ

0

Вы не хотите, чтобы сравнить два списка (что подразумевает List implements Comparable), но для сравнения элементов списков - это означает, что элементы должны быть Comparable не List (типа).

Что делает список SortedList, так это то, что при вставке нового элемента этот конкретный элемент вставлен в правильное положение в список.

+0

Я использую список в своей программе для двух разных объектов: я использую список в своем классе Set.Множество представляет собой набор натуральных чисел. Например: {1,2,3,4,5} - множество. Кроме того, я использую этот список в своем классе Table. Таблица состоит из переменных. Переменная состоит из ключа и значения. Ключ - это идентификатор (например, Alfa), а значением является Set {1,2,3}. Назначение - упорядочить элементы в списке от большого до малого. Как я могу это сделать? Большое большое спасибо! –

+0

«Назначение - заказать элементы в списке от большого до малого». Как я уже сказал, и @Peter Lawrey прокомментировал: «Самый простой» способ - сохранить список отсортированным, вставив новые элементы в правильную точку вставки¹. Таким образом, ваш список всегда сортируется (т. Е. Вам нужно изменить метод 'insert'.) ¹ Не забывайте, что у вас уже есть метод' find', который может оказаться полезным здесь. – Tedil

0

Для сортировки списка на Java вы можете использовать два интерфейса: сопоставимые и компараторы.
Вы можете использовать компаратор, сравнимый или оба.

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


import java.util.ArrayList; 
    import java.util.Collections; 
    import java.util.Iterator; 

    public class Demo { 

    private ArrayList<MyObject> list = new ArrayList<>(); 

    public Demo() { 
     init(); 
     //Collections.sort(list); //Default sort. 
     //Collections.sort(list, new SortByText()); 
     //Collections.sort(list, new SortByNumberDesc()); 
     output(); 
    } 

    public void init() { 
     list.add(new MyObject(100, "Hello4", 654.423)); 
     list.add(new MyObject(344, "Hello1", 65.423)); 
     list.add(new MyObject(3465, "Hello3", 65.23)); 
     list.add(new MyObject(43, "Hello8", 6523)); 
     list.add(new MyObject(87, "Hello2", 654.423)); 
     list.add(new MyObject(12432, "Hello5", 0.423)); 
     list.add(new MyObject(-432, "Hello7", 65.3)); 
     list.add(new MyObject(-5, "Hello6", 8979.487)); 
     list.add(new MyObject(10, "Hello9", 549.2)); 
    } 

    public void output() { 
     for (Iterator<MyObject> iterator = list.iterator(); iterator.hasNext();) { 
      MyObject next = iterator.next(); 
      System.out.println(next.getOutput()); 
     } 
    } 

    public static void main(String[] args) { 
     new Demo(); 
    } 

} 

public class MyObject implements Comparable<MyObject> { 

    private int index; 
    private String text; 
    private double number; 

    public MyObject(int index, String text, double number) { 
     this.index = index; 
     this.text = text; 
     this.number = number; 
    } 

    public String getText() { 
     return text; 
    } 

    public int getIndex() { 
     return index; 
    } 

    public double getNumber() { 
     return number; 
    } 

    @Override 
    public int compareTo(MyObject o) { 
     if (index > o.index) { 
      return 1; 
     } 
     if (index < o.index) { 
      return -1; 
     } 
     return 0; 
    } 

    public String getOutput() { 
     return "index: " + index + " text: " + text + " number2: " + number; 
    } 

} 

import java.util.Comparator; 

public class SortByText implements Comparator<MyObject> { 

    @Override 
    public int compare(MyObject o1, MyObject o2) { 
     return o1.getText().compareTo(o2.getText()); 
    } 
} 

import java.util.Comparator; 

    public class SortByNumberDesc implements Comparator<MyObject> { 
    @Override 
    public int compare(MyObject o1, MyObject o2) { 
     if (o1.getNumber() > o2.getNumber()) { 
      return -1; 
     } 
     if (o1.getNumber() < o2.getNumber()) { 
      return 1; 
     } 
     return 0; 
    } 
} 
Смежные вопросы