在列表

时间:2016-07-25 15:02:30

标签: java list

我是Android和Java编程的新手。我有这个方法的问题。 我试图计算相同字符串出现的次数。

例如:列表l中的输入,列表m

中的输出

列出l

  • 字符串1
  • 字符串1
  • 字符串2
  • 字符串2
  • 字符串2

列出m

  • 2x string1
  • 3x string2

我的名单:

    List<String> l = new ArrayList<>();
    List<String> m = new ArrayList<>();

我的方法:

public String Generuj() {
    String generator = "";
    int x = 0;
    int j = 0;


    if (l.size() > 0) {
        m.add(l.get(0));
        for (int i = 1; i < l.size(); i++) {
            while (j < l.size() && m.get(m.size() - 1).equals(l.get(j))) {
                x++;
                j++;
            }
            m.add("\n" + x + "x " + l.get(i));
        }
    }
    for (int i = 0; i < m.size(); i++) {
        generator = generator.concat(m.get(i));
    }
    return generator;
}

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

修改了OP的解决方案:(没有HashMap

public String Generuj() {
    String generator = "";
    int x = 0;

    while(l.size() > 0) {
        String someString=l.remove(0);
        x=0;
        for (int i = 0; i < l.size();) {
            if(l.get(i).equals(someString)){
                x++;
                l.remove(i);
            }else{
                i++;
            }
        }
        m.add("\n" + x + "x " + someString);
    }
    for (int i = 0; i < m.size(); i++) {
        generator = generator.concat(m.get(i));
    }
    return generator;
}

答案 1 :(得分:1)

如同wanpanman所说,你可以使用hashmap:

 private void countEachString(List<String> strings) {
        HashMap<String, Integer> stringCountMap = new HashMap<>();
        for (String string : strings) {
            if (!stringCountMap.containsKey(string)) stringCountMap.put(string, 0);
            stringCountMap.put(string, stringCountMap.get(string) + 1);
        }
        print(stringCountMap);
    }

    private void print(HashMap<String, Integer> hashMap) {
        for (String string : hashMap.keySet()) {
            Log.d("print out", hashMap.get(string) + " x " + string);
        }
    }

您可以根据需要更改打印

答案 2 :(得分:0)

我建议使用HashMap< String, Integer >,而不是简单地添加x。做这样的事情:

HashMap< String, Integer > countMap = new HashMap<>();
for( String s : l )
{
   if( countMap.containsKey( s ) )
   {
      // Add one to the string's occurrence.
      countMap.put( s, countMap.get( s ) + 1 );
   }
   else
   {
      // Set the string's first occurrence.
      countMap.put( s, 1 );
   }
}

您可以计算输入列表中所有字符串的所有匹配项。如果您仍然需要打印结果,则可以遍历HashMap EntrySet并从那里连接:

generator.concat( entry.getValue() + "x " + entry.getKey() );

答案 3 :(得分:0)

在Java 8中,您可以使用流轻松完成:

List<String> result = l.stream() // stream list l
    .collect(
        Collectors.groupingBy( // collect list elements to map grouping by keys and counting values
            Function.identity(),
            Collectors.counting()
        )
    )
    .entrySet() // get map's entry set
    .stream() // and stream it
    .map(entry -> entry.getValue() + "x " + entry.getKey()) // map each map entry to result string
    .collect(Collectors.toList()); // collect the results to new list