【问题标题】:Returning Elements From ArrayList Alphabetically按字母顺序从 ArrayList 返回元素
【发布时间】:2016-08-02 15:18:55
【问题描述】:

我正在开发一个操作化学式的程序,我正在编写一个方法,该方法需要遍历一个名为“terms”的 ArrayList 并按字母顺序返回第一个。

例如terms = {Term('H',4),Term('C',2),Term('H',4),Term('C',1)} 将返回 Term('C',2)

到目前为止,我已经编写了这段代码,但它不起作用。我是 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;
}

对于解决此问题的任何想法或建议,我将不胜感激。谢谢!

【问题讨论】:

    标签: java loops for-loop arraylist while-loop


    【解决方案1】:

    代码:

    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] 
    

    【讨论】:

    • 您只比较元素而忘记了元素计数。根据作者的说法,Term('C',2) 后面应该跟 Term('C',1)。
    • @Yaroslav 我没有看到 Term('C',2) 应该后跟 Term('C',1) 在 OPs 问题中暗示。我假设对元素名称(即第一个参数)强制执行排序
    • 作者 wtote: "eg terms = {Term('H',4),Term('C',2),Term('H',4),Term('C', 1)} 将返回 Term('C',2)" 这意味着计数很重要,并且 Term('C',2) 后面应该跟 Term('C',1)
    • @Yaroslav 感谢您的意见。我已经编辑了代码。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答!第二种方法对我来说真的很清楚,我使用了它,但我不明白为什么你在添加了 terms.get(index) 之后就放了 terms.remove(index)?我刚刚摆脱了那条线,它通过了我编写的所有测试
    • @JohnSmith 如果此答案解决了您的问题,请将其标记为已接受以帮助遇到相同问题的其他人
    【解决方案3】:

    这是你需要做的:

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

    【讨论】:

      【解决方案4】:

      你有两个选择:

      1. 让您的Term 类实现Comparable 接口并覆盖其compareTo() 方法。然后您可以使用Collections.sort(listOfTerms) 对它们进行排序并循环。
      2. 添加实现Comparator接口的类TermComparator,使用Collections.sort(listOfTerms, new TermComparator())并循环排序列表。

      【讨论】:

        【解决方案5】:

        使用Collections.sort(terms);它将按字母顺序排列列表。

        【讨论】:

        • 如果不通过Term 类实现Comparable 接口将无法工作
        猜你喜欢
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 2017-05-22
        • 2017-09-15
        相关资源
        最近更新 更多