我有一个字符串的arraylist
AA,BBB,CCC,DDD,AAA,AAA,AAA,VV,BBB,GGG,....
是否有可能按频率对其进行排序并删除所有重复元素?
我现在得到的是我创建了一个新的arraylist,其中:
所以从上面的例子:
aa,1 bbb,2 ccc,1 ddd,1 aaa,3 aaa,3 aaa,3 vv,1 bbb,2 ggg,1 ...
我想得到以下内容:
aaa,3 bbb,2 aa,1 ccc,1 ddd,1 vv,1 ggg,1
到目前为止我的代码:
for (int i = 0; i< arr_All_Items.size();i++)
{
new_Items.add(newItem_in_arr(arr_All_Items.get(i).toString(),Collections.frequency(arr_All_Items, arr_All_Items.get(i).toString())));
}
如何按降序排序new_items
?
谢谢
答案 0 :(得分:0)
您可以使用字符串和整数的Map对象,而不是arrayList。键是字符串,它们对应的对象是该字符串的频率。它只允许每种类型中的一种,您可以轻松获得所需的数据。
另一种方法是你可以创建一个包含字符串和频率的对象,并根据该对象的频率设置一个比较器。
答案 1 :(得分:0)
int frequencyLimit = 0;
// substitute Object for the specific type the array houses
for(Object o : arr_All_Items) {
int newFrequency = Collections.frequency(arr_All_Items, o.toString());
if(newFrequency > frequencyLimit) {
frequencyLimit = newFrequency;
}
}
for(int i = 0; i < arr_All_Items.size(); i++) {
// if item does not exist in the new array
if(!(new_Items.contains(arr_All_Items.get(i).toString()))) {
new_Items.add(newItem_in_arr(arr_All_Items.get(i).toString(), frequencyLimit -
Collections.frequency(arr_All_Items, arr_All_Items.get(i).toString()));
}
}
这应该根据与其频率相等的优先级将对象插入到列表中。如果最高频率为10,则具有该频率的对象将被置于索引0(10-10)。
答案 2 :(得分:0)
使用Collections.frequency()(可能)在列表的长度上具有二次性能,如果列表很长,这是不理想的。你可以在线性时间内完成:
(这是直接输入SO,所以可能有一些愚蠢的错误。但要点是正确的。)
创建一个表示字符串和计数的类。更好:使用泛型,避免将自己绑在一个字符串上:
public class Datum<T>
{
private final T t;
private int count;
public Datum (final T t)
{
this.t = t;
this.count = 0;
}
public void increment ()
{
++count;
}
public boolean matches (final T t)
{
return (null == this.t) ? (null == t) || this.t.equals (t);
}
public int getCount () { return count; }
public T getValue () { return t; }
}
遍历您的字符串列表,填充地图&gt;:
final Map<String, Datum<String>> map = new HashMap<> ();
for (final String str: yourList)
{
Datum<T> datum = map.get (str);
if (null == datum)
{
datum = new Datum<String> (str);
map.put (str, datum);
}
datum.increment ();
}
转储您的基准&lt;&gt;实例到ArrayList&lt;&gt;:
final List<Datum<String>> data = new ArrayList<> (map.values ());
使用比较计数成员的比较器进行排序:
class DatumComparator<T> implements Comparator<T>
{
@Override
public int compare (final Datum<T> t1, final Datum<T> t2)
{
// reverse this to reverse the sort order.
return t2.getCount () - t1.getCount ();
}
}
Collections.sort (data, new DatumComparator<String> ());
打印:
for (final Datum<String> datum: data)
{
System.out.println (datum.getValue () + ", " + datum.getCount ());
}