如何计算字符串HashMap中的Word出现

时间:2015-09-22 05:45:16

标签: java hashmap

我想知道如何修复我的代码,以便我的输出正确。我只能编辑代码的特定部分。非常感谢你

这是我的代码

import java.util.HashMap;

public class OccurenceChecker {
    public static void main(String[] args) 
    { 

        //CANT BE FIXED
        String phrase = "Good Morning. Welcome to my store. My store is a grocery store.";

        HashMap<String, Integer> map = new HashMap<String, Integer>();
        String[] ignored = phrase.split("\n\t\r(){},:;!?.[]");

        //CAN BE FIX THIS POINT ON.
        for (String ignore : ignored) 
        {
            Integer count = map.get(ignore);
            if (count == null) 
            {
                count = 0;
            }
            map.put(ignore, count + 1);
        }

        for (int i = 0; i< ignored.length; i++)
        {
            System.out.println(ignored[i]);
        }
        System.out.println(map);
    }
}

预期输出

{a=1, Morning=1, grocery=1, Welcome=1, is=1, to=1, store=3, Good=1, my=2}

我的输出

{=2, a=1, Morning=1, grocery=1, Welcome=1, is=1, to=1, store=3, Good=1, my=1, My=1}

3 个答案:

答案 0 :(得分:3)

您可以考虑一些建议:

在正则表达式中,\W指的是任何不是单词字符的东西(即任何不是字母的东西)。

如果您希望拆分任何标点符号或空格,那么在正则表达式中+后应该\W。这会将所有后续的计数作为同一分隔符的一部分。这就是你当前在答案中得到{=2的原因(输入中有两个“。”实例,它们被拆分解释为分隔符,null,分隔符)。

看起来好像你想要'my'和'My'被认为是同一个字符串。在这种情况下,您应该在将toLowerCase添加到地图之前使用Map<String,Integer> wordCount = new HashMap<>(); wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);

如果您使用的是Java 8,那么在地图中保持运行增量的一种简单方法就是

Map<String,Long> wordCount = Arrays.stream(phrase.toLowerCase().split("\\W+"))
    .collect(Collectors.groupingBy(Function.identy(), Collectors.counting());

同样,使用Java 8,您可以一次完成所有这些

{{1}}

答案 1 :(得分:1)

我将以短跑运动员的答案为基础,因为他完全忽略了在问题中可以改变的内容。

尽可能使用nuch Java 8。由于地图已经初始化,所以这对你的情况真的不起作用,所以你创建另一个并替换它很奇怪

map = Arrays.stream(ignored)
        .filter(s -> !s.isEmpty()) // removed empty strings
        .map(String::toLowerCase) // makes all the strings lower case
        .collect(Collectors.groupingBy(Function.identy(), Collectors.counting());

使用更基本的Java 8功能并使用最初创建的地图。

Arrays.stream(ignored)
        .filter(s -> !s.isEmpty()) // removed empty strings
        .map(String::toLowerCase) // makes all the strings lower case
        .forEach(s -> map.put(s, map.getOrDefault(s, 0) + 1)

没有Java 8

for (final String s : ignored) {
    if (s.isEmpty()) {
        continue; // skip empty strings
    }
    final String lowerS = s.toLowerCase();
    if (map.containsKey(lowerS)) {
        map.put(lowerS, map.get(lowerS) + 1)
    } else {
        map.put(lowerS, 1)
    }
}

答案 2 :(得分:0)

你的方法并不完全正确(如果你有其他符号怎么办?)。这样做:

  
      
  1. 用空格替换所有非字母数字字符。
  2.   
  3. 基于分割的空格(public class GoOnMap extends FragmentActivity { GoogleMap googleMap; MarkerOptions markerOptions; LatLng latLng; static double lat; static double lng; String location; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.geotracking); SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); // Getting a reference to the map googleMap = supportMapFragment.getMap(); Intent i=getIntent(); location=i.getStringExtra("address"); //getLocationInfo(location); new loadMap().execute(location); } public class loadMap extends AsyncTask<String , Integer, String> { public void getLatLongFromAddress() { new Thread(new Runnable() { @Override public void run() { String uri = "http://maps.google.com/maps/api/geocode/json?address=" + location + "&sensor=false"; HttpGet httpGet = new HttpGet(uri); HttpClient client = new DefaultHttpClient(); HttpResponse response; StringBuilder stringBuilder = new StringBuilder(); try { response = client.execute(httpGet); HttpEntity entity = response.getEntity(); InputStream stream = entity.getContent(); int b; while ((b = stream.read()) != -1) { stringBuilder.append((char) b); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } JSONObject jsonObject = new JSONObject(); try { jsonObject = new JSONObject(stringBuilder.toString()); lng = ((JSONArray) jsonObject.get("results")) .getJSONObject(0).getJSONObject("geometry") .getJSONObject("location").getDouble("lng"); lat = ((JSONArray) jsonObject.get("results")) .getJSONObject(0).getJSONObject("geometry") .getJSONObject("location").getDouble("lat"); Log.d("latitude", "" + lat); Log.d("longitude", "" + lng); } catch (JSONException e) { e.printStackTrace(); } } }).start(); } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub return null; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub LatLng latLng = new LatLng(lat, lng); // Setting the position for the marker markerOptions.position(latLng); // Setting the title for the marker markerOptions.title(""); // Placing a marker on the touched position googleMap.addMarker(markerOptions); // Locate the first location googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13)); } } } )。
  4.   
  5. 对于拆分数组中的每个字符串:a。检查是否有一个等于字符串的键:YES:获取值,增加计数和   把价值放回去。否:插入值为1的新密钥
  6.