Java - 按字母顺序排序以及将唯一元素整理在一起

时间:2016-04-06 12:57:14

标签: java sorting arraylist

我有一个填充了对象的数组列表,每个对象都有关于它们的信息。 例如:

{Term(C,2), Term(H,2), Term(C,1), Term(O,3)}

现在的目标是改变arraylist,结果就是这样:

{Term(C,3), Term(H,2), Term(O,3)}

我们希望将类似的术语整理在一起。我现阶段有以下几点。

char element = 'A';
int amt_atom = 0;
int index = 0;

char alphabet = 'A';
char alpha = 'A';

for (; alpha <= 'Z' ; alpha++){
    search:
    for ( ; alphabet <= 'Z' ; alphabet++ ) {
        for ( int i = 0 ; i < terms.size() ; i++){
            if ( terms.get(i).getElement() == alphabet){
                element = terms.get(i).getElement();
                amt_atom = terms.get(i).getAtoms();
                index = i;


                System.out.println(element + " , " + amt_atom + " , " + index );
                alphabet++;
                break search;
            }
        }
    }

    for (int i = 0 ; i < terms.size() ; i++){
        if ( terms.get(i).getElement() == element && i != index){
            int amt_atoms2 = terms.get(i).getAtoms();
            terms.set(index, new Term ( element, amt_atom + amt_atoms2 ));
            terms.remove(i);
        }
    }
}

此外,给出的数组可能不是字母,我们还必须按字母顺序排列。 另一个例子是:CH3CH2CH2CH2CH2CH3,结果= C6H14

编辑:抱歉,应该指明原始代码有什么问题。 因此,执行C2H2HO3会产生C2H3O3这很棒,因为它是正确的,但当我尝试CH3CH2CH2CH2CH2CH3时,我得到的C2H5完全没有问题。我不确定为什么会这样。

我是否走在正确的轨道上?有人可能会告诉我我做错了什么吗? 我是Java的新手,因此拥有非常基础的知识,所以如果你能在使用我上面可能使用的java的结构和元素时解释一些东西会很好。感谢

2 个答案:

答案 0 :(得分:3)

首先排序,然后整理?您可以让Term实现Comparable界面,然后只需拨打terms.sort();即可。然后查看列表并进行整理,一旦排序就更容易了。

不要过分担心这里的表现。它应该很快。

答案 1 :(得分:0)

使用Java 8非常容易:

//grouping by alphabet
Map<Character, List<Integer>> groupedTerms = terms.stream().collect(Collectors.groupingBy(Term::getElement)))
//Calculate count
Map<Character, Int> calculated = groupedTerms.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream().mapToInt(Integer::intValue).sum()));
//And sort
Map<Character, Int> result = calculated.stream().sorted(Map.Entry.byKeyComparator()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

结果你已经对地图字符 - Int:

进行了排序
["A"-> 10, "C" -> 5]