从数组中获取最频繁的值

4

我有一个如下所示的数组

String[] football_club = {"Barcelona", "Real Madrid", "Chelsea", "Real Madrid", "Barcelona", "Barcelona"};

//result
Sting result_club = "a value most in the array"

在上面的数组中,"巴塞罗那" 经常出现在该数组中。
如何编写代码来查找数组中出现最频繁的值?


帮我理解你的问题。你想要计算数组中单词重复出现的次数吗? - Blackbelt
1
请查看这个。希望它能帮到你。http://fruzenshtein.com/exercise-1/ - Rethinavel
你应该提供更多关于“你尝试过什么”和你遇到了哪些问题的细节。仅仅寻求代码解决问题可能会被视为stackoverflow上的离题行为(请参见关于提问的帮助页面)。 - Viktor Seifert
@blackbelt:是的,然后数组中的一个值将显示出来。你能帮我吗?谢谢。 - ramadani
6个回答

7
你可以创建一个 HashMap<String,Integer>。如果这个 String 已经出现在 map 中,就将其对应的 key 值加一,否则将其添加到 map 中。
例如:
put("Barcelona", 1);

接下来,假设又是"巴塞罗那",你可以执行以下操作:

put("Barcelona", get("Barcelona") + 1);

由于“巴塞罗那”的是1,现在当您输入它时,该键将变为2。


3
import java.util.HashMap;

/**
 * Created with IntelliJ IDEA.
 * User: Alexander.Iljushkin
 * Date: 23.10.13
 * Time: 11:32
 */
public class TestClass1 {


    public static void main(String[] args) {
        String[] football_club = {"Barcelona", "Real Madrid", "Chelsea", "Real Madrid", "Barcelona", "Barcelona"};
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        String tempStr;
        for (int i = 0; i < football_club.length; i++)
        {
            tempStr = football_club[i];
            if(map.containsKey(tempStr))
            {
                map.put(tempStr, map.get(tempStr) + 1);
            }
            else
            {
                map.put(tempStr,1);
            }
        }

        System.out.print(map.toString());
    }
}

稍后您可以使用比较器按下面所述的数量对地图中的项进行排序(这只是一个例子,在自学的过程中可以更改):
public class Testing {

    public static void main(String[] args) {

        HashMap<String,Double> map = new HashMap<String,Double>();
        ValueComparator bvc =  new ValueComparator(map);
        TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);

        map.put("A",99.5);
        map.put("B",67.4);
        map.put("C",67.4);
        map.put("D",67.3);

        System.out.println("unsorted map: "+map);

        sorted_map.putAll(map);

        System.out.println("results: "+sorted_map);
    }
}

class ValueComparator implements Comparator<String> {

    Map<String, Double> base;
    public ValueComparator(Map<String, Double> base) {
        this.base = base;
    }

    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}

当你对哈希表进行排序后,只需获取第一个键,这将是最频繁的键。


@user1878292 修改了答案。然后,当你对哈希映射进行排序后,只需获取第一个键即可找到最频繁的键。 - Alexander.Iljushkin
我明白了,是真的。非常感谢您的回答 :) - ramadani

2
另一种方法:对数组进行排序,然后遍历它以计算连续的相同元素,并跟踪最大计数/相应元素。
排序可能较重(相对而言),但我认为哈希映射访问具有相同数量级的复杂度(O(n.log(n)))。

1
这个代码完美运行,max是新的变量,用于存储找到的最大计数。如果两个元素具有相同的频率,则返回字符串数组 football_club = {"Chelsea","Chelsea", "Real Madrid", "Real Madrid", "Real Madrid", "Barcelona" ,"Chelsea"}; 的结果为:Chelsea。
private String getRepeatedString(String[] football_club) {
    List<String> List1 = Arrays.asList(football_club);
    HashMap<String, Integer> data = new HashMap<String, Integer>();
    int max = 0;
    for (String string : List1) {
        int count = 1;
        if (data.containsKey(string)) {
            count = data.get(string) + 1;
            data.put(string, count);
        } else {
            data.put(string, 1);
        }
        if (max < count)
            max =count;
    }
    System.out.println(data);
    for (Entry<String, Integer> entry : data.entrySet()) {
        if (max == entry.getValue()) {
            return entry.getKey();
        }
    }
    return null;
}

1
如果性能不重要:
        String[] football_club = {"Barcelona", "Real Madrid", "Chelsea", "Real Madrid", "Barcelona", "Barcelona"};              
        List<String> l = Arrays.asList(football_club);
        Set<String> s = new HashSet<String>(l);
        for (String key : s) {
            int count = Collections.frequency(l, key);
            System.out.println("Found '" + key + "' " + count + " times.");
        }

0
你可以定义一个新的类来封装一个HashMap对象。
然后你可以定义自己的put和get方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接