如何检查 1 是 java 中的素数并且 Hashmap 的输出对于 String 类型是错误的
how to check 1 is prime number in java and Hashmap's output is wrong for String type
我目前正在解决 this problem 关于 Hacker运行k 的问题,以下是我目前编写的代码。
当我运行它时,有两个错误:即使输入和过程正确,输出也是完全错误的,当输入为1时,它不会将其添加到我的哈希图。我相信这两个错误的存在是因为使用了 HashMap。例如,如果输入是
3(testcases) ==> 12, 5, 7。它会打印出 Prime, Prime, Not prime 而不是像 Not prime, Prime, Prime 这样的正确输出。
有关更多信息,我注释掉了这些行,说 "output purposes"。你可以看到,它以正确的顺序添加到 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());
}
}
}
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
编辑:正如MeBigFatGuy and smarx所建议的,entrySet() 迭代器在与增强循环一起使用时效果更好。
示例:
for (Map.Entry mentry : newmap.entrySet())
{
System.out.format("%s = %s\n", mentry.getKey(), mentry.getValue());
}
您假设 Hashmap 的 entrySet 上的迭代器将 return 条目按照您添加它们的相同顺序。一个普通的旧 HashMap 不能保证任何类型(没有双关语意)。尝试改用 LinkedHashMap。
您的代码中的问题是您的 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 时,在继续之前更新地图;
内部内部 for 循环,
使用 break 而不是 continue
一些调整
- 如果你的数组没有重复项,那么不要浪费内存
哈希图。在数组上循环。
编码练习有大量输入需要读取,请改用 bufferedreader 以获得更快的吞吐量
- 正确使用泛型
@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);
}
}
}
我目前正在解决 this problem 关于 Hacker运行k 的问题,以下是我目前编写的代码。
当我运行它时,有两个错误:即使输入和过程正确,输出也是完全错误的,当输入为1时,它不会将其添加到我的哈希图。我相信这两个错误的存在是因为使用了 HashMap。例如,如果输入是
3(testcases) ==> 12, 5, 7。它会打印出 Prime, Prime, Not prime 而不是像 Not prime, Prime, Prime 这样的正确输出。
有关更多信息,我注释掉了这些行,说 "output purposes"。你可以看到,它以正确的顺序添加到 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());
}
}
}
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
编辑:正如MeBigFatGuy and smarx所建议的,entrySet() 迭代器在与增强循环一起使用时效果更好。
示例:
for (Map.Entry mentry : newmap.entrySet())
{
System.out.format("%s = %s\n", mentry.getKey(), mentry.getValue());
}
您假设 Hashmap 的 entrySet 上的迭代器将 return 条目按照您添加它们的相同顺序。一个普通的旧 HashMap 不能保证任何类型(没有双关语意)。尝试改用 LinkedHashMap。
您的代码中的问题是您的 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 时,在继续之前更新地图; 内部内部 for 循环, 使用 break 而不是 continue
一些调整 - 如果你的数组没有重复项,那么不要浪费内存 哈希图。在数组上循环。
编码练习有大量输入需要读取,请改用 bufferedreader 以获得更快的吞吐量
- 正确使用泛型
@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);
}
}
}