【问题标题】:Increment individual values in a HashMap增加 HashMap 中的单个值
【发布时间】:2016-05-18 05:49:37
【问题描述】:

所以我完全被 Java 课的家庭作业所困扰。在其中,我需要编写一个程序来分析 Web 服务器的日志文件,以确定哪些计算机尝试访问该 Web 服务器的次数最多。我选择使用映射来跟踪使用它运行的文件,以便将每个唯一地址保存为一个整数值,每次代码找到重复的 IP 地址时,该整数值都会增加。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class LogTester 
{
 public static void main(String[] args)
 {
    int individualCounter = 0;
    int ipcounter = 0;
    Map<String, Integer> ipCheck = new HashMap<String, Integer>();
    System.out.println("Enter a log file to be analyzed");
    Scanner ui = new Scanner(System.in);
    String filename = ui.nextLine();
    File name = new File(filename);
    try 
    {
        Scanner dataStore = new Scanner(name);
        while(dataStore.hasNextLine())
        {
            //get the entire line from the log file
            String line = dataStore.nextLine();

            //find the location of the word "client", then move 7 more spaces (see log file)
            int subscriptOfClient = line.indexOf("client");
            String s1 = line.substring(subscriptOfClient + 7);
            //we now have a smaller string
            //this string begins with the IP address
            //se we find the ending bracket and extra the ip
            int subscriptOfBracket = s1.indexOf("]");
            String s2 = s1.substring(0, subscriptOfBracket);
            ipcounter++;
            ipCheck.put(s2, individualCounter++);

            //print out the IP(in the assignment, put this into a map)
        }
        System.out.println("Found " + ipcounter + " unique IP addresses.");
        System.out.println("The most suspicious are: ");
        for(String key : ipCheck.keySet()){
             System.out.println(key);
         }
    } 
    catch (FileNotFoundException e) 
    {
        System.out.println("Could not open that file");
    }
 }
}

我面临的问题是我不确定如何增加每个单独 IP 地址的值,以便以后可以将它们与三个最常用的 IP 地址进行比较(我已经可以处理)。使用我的 individualCounter 变量,我希望能够以某种方式将其转化为整数值,但就目前而言,由于我的编码很糟糕,它始终与 ipcounter 相同。

我正在寻找的一个例子是:77.46.30.42 出现 59 次,207.42.179.85 出现 46 次,85.114.128.137 出现 19 次。

我的一个同学建议我尝试 set,但我觉得这并不能真正帮助我更接近,因为 map 已经检查了重复项。

【问题讨论】:

标签: java dictionary hashmap set keyvaluepair


【解决方案1】:

你可以这样做:

if(ipCheck.containsKey(s2)){
    ipCheck.put(s2, ipCheck.get(s2)+1);
}else{
    ipCheck.put(s2, 1);
}

它的作用是检查 IP 是否已经在地图中,如果是,则获取该 IP 的先前计数并将其加一,如果不是,则将其添加到地图中并设置它的计数为 1。

【讨论】:

  • if 语句以“操作参数无效 ++/--”消息响应我。你确定格式正确吗?
  • @Tyler 哦,你说得对,我已经编辑了我的问题来解决这个问题。
  • 好的,所以现在它正确地将每个 IP 的值更改为 1。但是,每次遇到副本时它都不会增加它。检查重复是否能够进一步增加计数器,或者它只是停留在一个?例如 209.129.94.61 弹出 10 次,但它只提供 1 次。
  • @Tyler 是的,没错。 209.129.94.61 出现 10 次可能是因为您忘记删除此行 ipCheck.put(s2, individualCounter++);,请确保我发布的代码是唯一在地图中添加条目的代码(唯一调用 ipCheck.put(....) 的代码) .
  • 我的意思是 209.129.94.61 出现了 10 次不同的时间,所以我需要将重复项添加到计数器上,所以它的总数是 10,而不是 1。因为代码是,根据您的有用建议,它只达到 1。所以从这里开始,是否可以检查重复项以允许它增加 ipCheck.get(s2) 的值
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 2019-02-19
  • 2019-10-04
  • 2014-03-22
相关资源
最近更新 更多