簡體   English   中英

如何檢查1是Java中的質數,並且Hashmap的輸出對於String類型是錯誤的

[英]how to check 1 is prime number in java and Hashmap's output is wrong for String type

我目前正在Hackerrank上解決此問題 ,下面是我到目前為止編寫的代碼。

當我運行它時,有幾個錯誤:即使輸入和過程正確,輸出也完全錯誤;當輸入為1時,它不會將其添加到我的哈希圖中。 我相信這兩個錯誤都因為使用HashMap而存在。 例如,如果輸入是

3(測試用例)==> 12、5、7。它將打印出Prime,Prime,Not prime,而不是諸如Not prime,Prime,Prime的正確輸出。

有關更多信息,我用“輸出目的”注釋了這些行。 您可以看到,它以正確的順序添加到了哈希圖中,但是在打印時,它變得混亂了。

因此,我很好奇是否有人可以解釋為什么打印錯誤,並在輸入為1時修復該零件。

import java.io.*;
import java.util.*;

public class Solution1 {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] myarray = new int[n]; // read number of testcases

    for(int i=0;i<n;i++){ // add input to my int array
        myarray[i]=sc.nextInt();
    }

    HashMap<Integer, String> newmap = new HashMap <>(); // create empty hashmap
    int temp;
    int value;
    for(int i=0;i<n;i++){   // loop based on num of testcases
        temp =myarray[i];
        boolean isprime = true; 
        if(temp ==1){   // hardcode for input 1
            isprime = false;
            continue;
        }
        for(int j=2;j<=temp/2;j++){     // checking whether the input is prime or not
            value = temp%j;
            if(value==0){
                isprime = false;
                continue;
            }
        }
        if(isprime==true){  
            //System.out.println("temp(Prime): "+temp); //output purpose
            newmap.put(temp,"Prime");
        }
        else{
            //System.out.println("temp(Not prime): "+temp); //output purpose
            newmap.put(temp,"Not prime");
        }
    }

  Set set = newmap.entrySet();
  Iterator iterator = set.iterator();
  //printing out values of the each element in hashmap(newmap)
  while(iterator.hasNext()) {
     Map.Entry mentry = (Map.Entry)iterator.next();
     System.out.println(mentry.getValue());
    }


   }
}

您的代碼中的問題是myarray未排序,並且當您插入newmap時,它未按所需順序插入。

我建議您對數組進行排序,並使用諸如LinkedHashMap或鏈接列表之類的有序映射。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] myarray = new int[n]; // read number of testcases

    Arrays.sort(myarray);

    for (int i = 0; i < n; i++) { // add input to my int array
        myarray[i] = sc.nextInt();
    }

    HashMap<Integer, String> newmap = new LinkedHashMap<Integer, String>(); // create
                                                                            // empty
                                                                            // hashmap
    int temp;
    int value;
    for (int i = 0; i < n; i++) { // loop based on num of testcases
        temp = myarray[i];
        boolean isprime = true;
        if (temp == 1) { // hardcode for input 1
            isprime = false;
            break;
        }
        for (int j = 2; j <= temp / 2; j++) { // checking whether the input
                                                // is prime or not
            value = temp % j;
            if (value == 0) {
                isprime = false;
                break;
            }
        }
        if (isprime == true) {
            // System.out.println("temp(Prime): "+temp); //output purpose
            newmap.put(temp, "Prime");
        } else {
            // System.out.println("temp(Not prime): "+temp); //output
            // purpose
            newmap.put(temp, "Not prime");
        }
    }

    Set set = newmap.entrySet();
    Iterator iterator = set.iterator();
    // printing out values of the each element in hashmap(newmap)
    while (iterator.hasNext()) {
        Map.Entry mentry = (Map.Entry) iterator.next();
        System.out.println(mentry.getValue());
    }

}

}

@Jim Lewis和@Michael Markidis已經為如何解決此代碼中的錯誤提供了正確的答案。

我認為,為了滿足您進行編碼工作的要求,您需要按照與輸入數字相同的順序輸出結果,因此您需要將結果按順序收集到某種東西中,而不是按順序(無序) HashMap 這是一些使用ArrayList進行了一些清理的代碼(盡管坦率地說,您應該能夠隨即打印出結果):

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] inputs = new int[n]; // read number of testcases

        for (int i = 0; i < n; i++) { // add input to my int array
            inputs[i] = sc.nextInt();
        }

        List<String> results = new ArrayList<>();

        for (int number : inputs) {
            boolean isprime = true;

            if (number == 1) { // hardcode for input 1
                isprime = false;
            } else {
                for (int j = 2; j <= number / 2; j++) { // checking whether the input is prime or not
                    if (number % j == 0) {
                        isprime = false;
                        continue;
                    }
                }
            }

            results.add(isprime ? "Prime" : "Not prime");
        }

        for (String result : results) {
            System.out.println(result);
        }
    }

}

HashMap沒有可預測的順序。 但是,您可以像這樣打印出與每個值關聯的鍵:

for (Iterator<Integer> iter = newmap.keySet().iterator(); iter.hasNext(); )
{
    int key = iter.next();
    System.out.println(key + "=" + newmap.get(key));
}

這將輸出:

 5=Prime 7=Prime 12=Not prime 

編輯 :如MeBigFatGuysmarx所建議,與增強循環一起使用時,entrySet()迭代器更好。

范例

for (Map.Entry mentry : newmap.entrySet())
{
    System.out.format("%s = %s\n", mentry.getKey(), mentry.getValue());
}

您假設在Hashmap的entrySet上進行迭代的迭代器將按照添加條目的順序返回條目。 一個普通的舊HashMap不能保證沒有任何保證(無雙關語)。 嘗試改用LinkedHashMap。

在檢查1時,請先更新地圖,然后再繼續; 在內部for循環中,使用break而不是Continue

一些調整-如果您的數組沒有重復項,則不要在哈希圖中浪費內存。 在數組上循環。

  • 編碼練習需要讀取大量輸入,請改用bufferedreader以獲得更快的吞吐量

    • 正確使用泛型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM