无法检索哈希图中添加的值

时间:2020-08-12 12:32:49

标签: java hashmap

当我第二次尝试检索数据时,此代码没有给我数据。

  1. 我输入域名和IP地址
  2. 再次输入DN和Ip
  3. 我搜索第一个IP会给出正确的结果。
  4. 当我搜索第二个IP时,它说找不到域名

我不确定为什么我的循环没有给出正确的结果? 我可以看到该数据可用,它进入if部分已验证但不返回数据,它转到else部分并打印出没有可用数据。

 //Main class
{
     System.out.println("1. Add DNS details");
     System.out.println("2. Find matching Domain Name");
     System.out.println("3. Exit");
     System.out.println("Enter your choice");

    //After entering the choice 
    System.out.println("Enter the IP address to find the domain name");
    ip = sc.nextLine();
    DomainName = dBO.findDomainName(ip);
}

    //FindDomainname.java class
    public String findDomainName(String ipAddress) {
        
      String domain=null;
        
        if(domainMap.isEmpty()){
        return domain;
        }
        else
        for (Map.Entry<String, String> entry : domainMap.entrySet()) {
            String k = entry.getKey();
            String v = entry.getValue(); 
            
            if (ipAddress.equals(v)) {
                domain = k;                 
            }
            else
            {
                domain = "No matching domain name found";
                
            }
     }    
    
    return domain;
}

2 个答案:

答案 0 :(得分:1)

一旦找到条目,您就需要跳出for循环,否则它将在映射中的下一个条目上移动,并且该条目可能不匹配。像这样添加break语句:

#include <iostream>
#include <fstream>
#include <string>
using namespace std; // only for demos/slideware/toy projects.
int mindex = -1;
string word[10]; // we will only ever get 10 strings? 
                 // 10 is a magic number use a const like const int maxWords = 10;
                 // using std::array will catch problems like this, std::vector can be used to dynamically resize the array.

void push(string p);
void top();
void pop();
bool isEmpty();

int main() {
    string filename,eli;
    cout << "Please input a file name" << endl;
    cin>>filename;
    ifstream inData;
    inData>>eli; // reading from not open file!!!
    inData.open(filename);
    if (!inData) { 
        cerr<< "Error opening : " << filename << endl;
        return -1;
    };

    while (inData >> eli) {
        if(inData.fail()) {
            break;
        } else 
            push(eli);
    }

    while (!isEmpty()){
         top();
         pop();
    }

    inData.close();
    return 0;
}

void push(string p){
    index++; // did you mean mindex???
    word[mindex] = p; // fatal error if mindex is not at least 0.
}

void pop(){
  mindex--;
}

void top(){
    cout<<word[mindex]<<" ";
}

bool isEmpty(){
    return (mindex<0);
}

答案 1 :(得分:1)

一种流解决方案。找到匹配项后,您的错误并未打破循环。

public String findDomainName(String ipAddress) {
    return domainMap.entrySet().stream()
        .filter(entry -> entry.getValue().equals(ipAddress))
        .findAny().orElse(domainMap.isEmpty() ? null
                          : "No matching domain name found");
}