2016-04-12 4 views
0

Я работаю над программой для обработки химических формул, и я пишу метод, который нужно перебирать через ArrayList, называемый «terms», и возвращать первый в алфавитном порядке.Возвращаемые элементы из ArrayList По алфавиту

например. Термин ('C', 1)} возвращает Term ('C', 4), Term ('C', 2), Term ('H', 4), Term ('C', 1)}

Я написал этот код до сих пор, но он не работает. Я - настоящий новичок на языке Java.

public Term nextElement() 
{ 
    int i = 0; 
    for (i = 0; i < terms.size()-1; i++) 
    { 
     int j = 1; 
     while (i + j <= terms.size()) 
     if (terms.get(i).getElement() > terms.get(i+j).getElement()) 
     { 
      terms.remove(i+j++); 
      return terms.get(i); 
     } 
    } 
    return null; 
} 

Я бы по достоинству оценил любые идеи или предложения по решению этой проблемы. Благодаря!

ответ

0

1- можно реализовать Comparable и переопределить compareTo()

int compareTo(Object obj){ 
Term term = (Term)obj; 
if(term.getElement < this.getElement()) 
    return 1; 
else if (term.getElement == this.getElement()) 
    return 0; 
else 
    return -1; 
} 

затем использовать

Collection.sort(terms); 

2-

public Term nextElement() 
    { 
     char minElement = 'Z'; 
     int index = 0; 
     for (int i = 0; i < terms.size(); i++) 
     { 
      if (terms.get(i).getElement() < minElement) 
      { 
       minElement = terms.get(i).getElement(); 
       index = i; 
      } 
     } 
     Term temp = terms.get(index); 
     terms.remove(index) 
     return temp; 
    } 
+0

Спасибо за этот ответ! Второй метод действительно ясен для меня, и я использовал это, но я не понимаю, почему вы поставили terms.remove (index) сразу после добавления term.get (index)? Я просто избавился от этой строки и пропустил все тесты, которые я написал –

+0

@JohnSmith, если этот ответ зафиксировал вашу проблему, отметьте ее как принятую, чтобы помочь другим людям, которые имеют одинаковую проблему –

0

Collections.sort(terms); будет упорядочивать список по алфавиту.

+1

не будет работать без реализации 'интерфейс Comparable' на' Term' класса –

3

У вас есть два варианта здесь:

  1. Пусть ваши Term класса реализация Comparable интерфейса и переопределить его метод compareTo(). Затем вы можете использовать Collections.sort(listOfTerms), чтобы отсортировать их и выполнить цикл.
  2. Добавить класс TermComparator, который реализует интерфейс Comparator, используйте Collections.sort(listOfTerms, new TermComparator()) и перейдя по отсортированному списку.
0

Это то, что вам нужно сделать:

List<Term> terms = //your list 
Collections.sort(terms, new Comparator<Term>() { 
    @Override 
    public int compare(Term t1, Term t2) { 
     return t1.getElement().compareTo(t2.getElement()); 
    } 
}); 
0

КОД:

public class CodeSample { 


public static void main(String[] args) { 
    List<Term> terms=new ArrayList<Term>(); 
    terms.add(new Term('H',4)); 
    terms.add(new Term('C',2)); 
    terms.add(new Term('H',4)); 
    terms.add(new Term('C',1)); 
    System.out.println("Before Sorting"); 
    for(Term term:terms){ 
     System.out.print(term.toString().concat(" ")); 
    } 
    Collections.sort(terms,new Comparator<Term>() { 
     @Override 
     public int compare(Term object1, Term object2) {     
      if (object1.getElement() != object2.getElement()) { 
       return object1.getElement() - object2.getElement(); 
      } else { 
       return object2.getCount() - object1.getCount(); 
      }   
     } 
    }); 
    //Sorted terms 
    System.out.println("After Sorting"); 
    for(Term term:terms){ 
     System.out.print(term.toString().concat(" ")); 
    } 
} 

public static class Term{ 
    private char element; 
    private int count; 
    public Term(char element, int count) { 
     super(); 
     this.element = element; 
     this.count = count; 
    } 
    public char getElement() { 
     return element; 
    } 
    public int getCount() { 
     return count; 
    } 
    @Override 
    public String toString() { 
     return "Term [element=" + element + ", count=" + count + "]"; 
    }  
} 
} 

ВЫВОД:

Before Sorting 
Term [element=H, count=4] Term [element=C, count=2] Term [element=H, count=4] Term [element=C, count=1] 
After Sorting 
Term [element=C, count=2] Term [element=C, count=1] Term [element=H, count=4] Term [element=H, count=4] 
+0

Вы только сравнить элементы и забыл о количестве элементов. По словам автора Term ('C', 2), следует Term ('C', 1). –

+0

@ Ярослав Я не вижу, что Term ('C', 2) следует за Term ('C', 1), подразумеваемым в вопросе OPs. Я предположил, что упорядочение выполняется в именах элементов (т.е. первый параметр) – alphablue

+0

Автор: «например, термины = {Термин ('H', 4), Term ('C', 2), Term ('H', 4), Term ('C', 1)} возвращает Term ('C', 2) ", что означает подсчет вопросов, а Term ('C', 2) должен следовать Term ('C', 1) –

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