我有一个填充了对象的数组列表,每个对象都有关于它们的信息。 例如:
{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的结构和元素时解释一些东西会很好。感谢
答案 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]