如何按每个元素的频率对字符串的arylylist进行排序并删除重复?

时间:2014-03-10 16:21:43

标签: java arraylist

我有一个字符串的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

谢谢

3 个答案:

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