如何检查1是java中的素数,而Hashmap的输出对于String类型

时间:2016-06-19 02:07:36

标签: java string hashmap primes

我目前正在Hackerrank上解决this problem,下面是我到目前为止编写的代码。

当我运行它时,有几个错误:即使输入和进程正确,输出也完全错误,当输入为1时,它不会将其添加到我的hashmap中。我相信由于使用HashMap,两个错误都存在。例如,如果输入是

3(测试用例)==>它将打印出Prime,Prime,Not prime而不是像Not prime,Prime,Prime这样的正确输出。

有关详细信息,我注释掉了这些行,并说出了“输出目的”。你可以看到,它以正确的顺序添加到hashmap中,但是当它打印时,它搞砸了。

所以,我很好奇是否有人可以解释为什么打印错误,并在输入为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());
    }


   }
}

5 个答案:

答案 0 :(得分:2)

代码中的问题是你的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());
    }

}

}

答案 1 :(得分:2)

@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);
        }
    }

}

答案 2 :(得分:1)

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());
}

答案 3 :(得分:1)

您假设Hashmap的entrySet上的Iterator将以您添加它们的相同顺序返回条目。一个普通的旧HashMap保证没有任何排序(没有双关语意)。请尝试使用LinkedHashMap。

答案 4 :(得分:1)

在检查1时,在继续之前更新地图; 内部for循环, 使用break而不是continue

一些调整   - 如果你的阵列没有重复,那么就不要浪费内存    包含HashMap。循环阵列。

  • 编码练习需要读取大量输入,使用bufferedreader代替更快的吞吐量

    • 正确使用泛型