java da katta o'lchamli qatorni qanday olish kerak

Men java uchun yangi va java kattaligi kattaligi kattaroq bo'lishini xohlayman. Lekin, menga ba'zi bir ish vaqti xatosi beradi - NZEC, men bu haqda bilmayman va men bu xato haqida ba'zi tadqiqotlar qildim, lekin did'nt mening muammom bilan bog'liq narsalarni topdi.

   long n=sc.nextLong();// n can be upto 10^9;
   long a[]=new long[n];// declaring array of n;

Shuningdek, kompilyatsiya vaqtida xato yuzaga keladi:

error: incompatible types: possible lossy conversion from long to int

har kim mening bu muammoni hal qila oladimi?

1
Qanday Java-xotirani aniqlaysiz? Shuni esda tutingki, bunday qator uchun bo'shliqlar Java/asosiy OS uchun qiyin bo'lishi mumkin, chunki bu xotira miqdori nafaqat bepul bo'lishi kerak, balki bu katta hajmli xotira ham bo'lishi kerak.
qo'shib qo'ydi muallif Jiri Tousek, manba
Qaysi qator aniq xatolarni keltirib chiqaradi (to'liq stacktrace)? Iltimos, savolni tahrirlang va barcha tegishli ma'lumotlarni qo'shing.
qo'shib qo'ydi muallif JF Meier, manba

6 javoblar

Array kattaligi int hajmi bilan cheklangan (ya'ni taxminan 2 milliard). Siz long bilan boshlashni xohlaysiz. int hajmini o'qib chiqing yoki uzoq vaqt [] = uzunlik [(int) n]; uzunligi bilan uzunni uzing.

Men biron bir nozik xatoga yo'l qo'ymaslik uchun oldingi maslahat beraman.

1
qo'shib qo'ydi
@Thiefster Shuning uchun birinchi yondashuvni tavsiya qildim.
qo'shib qo'ydi muallif Kayaman, manba
Uzoqdan int ga nusxa olish xatoning sizni to'sib qo'yishi mumkin bo'lgan muammolarga sabab bo'lishi mumkin. Buning yagona yo'li - birinchi navbatda o'lcham uchun uzoq vaqt foydalanmaslikdir.
qo'shib qo'ydi muallif Thiefster, manba

Array sizes are limited to int size in java. so you need to create your array with int sizes always. you have to take n as int. and replace the long n=sc.nextLong();// n can be upto 10^9; by int n=sc.nextInt();// n can be upto 10^9;

U mukammal ishlaydi.

0
qo'shib qo'ydi

Bunday katta hajmga ega bo'lish birinchi navbatda samarasiz bo'lishi mumkin. Buning o'rniga siz foydalanish holatlarida sizga yordam beradigan yaxshi ma'lumot strukturasi bo'lishi mumkin. Agar hujum qilinsa umumiy muammo bo'lishi mumkin, agar uni taqdim etsa, uni boshqa samarali usul bilan hal qilishga yordam berishi mumkin.

0
qo'shib qo'ydi

An array index cannot be specified with a long as you have done but only with an int as the array size is limited to Integer max value

2 ^ 31-1. (2 milliarddan ortiq) va sizning talabingiz past bo'ladi: 10 ^ 9 (1 mlrd.)  Shunday qilib, o'rnini o'zgartirish kerak:

   long n=sc.nextLong();// n can be upto 10^9;

tomonidan

   int n=sc.nextInt();// n can be upto 10^9;
0
qo'shib qo'ydi

Boshqa javoblar keltirilganidek, qator ko'rsatkichlari int -based va array, nima bo'lishidan qat'i nazar, siz xohlagan narsalar uchun to'g'ri ma'lumotlar tuzilishi emas.

Xotiradan foydalanishni ko'rib chiqaylik. Bir qatorda 12 ta bayt obyekti sarlavhasi, undan so'ng n * v baytlar (bu erda n qator qatori va v siz saqlaydigan turning o'lchami).

Masalan, quyidagi qator arizasini ko'rib chiqaylik:

long[] longArray = new long[Integer.MAX_VALUE];

Uzunligi 64 bit, yoki 8 bayta. Integer.MAX_VALUE 2147483647 ni tashkil etadi. Bu sizning qatoringiz 17179869188 baytni yoki boshqa so'z bilan 17 GB RAMni oladi.

Katta massivlarni yaratish mumkinmi? Albatta: siz ko'p o'lchamli qatorni (har bir qo'shimcha o'lcham Integer.MAX_VALUEgacha mavjud pozitsiyalarni ko'paytirishi mumkin) amalga oshira olasiz, lekin xotira ishlatish dahshatli bo'ladi. Quyidagi misolni ko'rib chiqaylik:

long[] multiArray = new long[5][5];

Ushbu qator 25 pozitsiyaga ega, shuning uchun mening oldingi formulamga ko'ra, 25 * 8 + 12 bayt yoki 212 baytlarni oladi, ammo 2 o'lchovli qator har bir Ichki qatorda ob'ekt boshlig'i bor, shuning uchun biz (5 * 8 + 12) * 5 + 12 bayt yoki 272 baytlardan so'zlaymiz. Endi buni yanada kengroq darajada amalga oshirishni tasavvur qiling.

long[] multiArray = new long[Integer.MAX_VALUE][Integer.MAX_VALUE];

Bu esa (Integer.MAX_VALUE * 8 + 12) * Integer.MAX_VALUE + 12 baytlarini yoki 3.689348813882917e19 baytni (36.89 exabytes yoki 36.89 milliard GB) oladi.

Agar, albatta, bu ma'lumotlarning miqdori bilan ishlamoqchi bo'lsangiz, ehtimol siz qatorni emas, balki hisoblash majmui kerak.

0
qo'shib qo'ydi

Java-dagi qatorlar hajmi int . Agar uzun int dan ko'proq ma'lumot olish mumkin bo'lsa, long dan int ga aylantirilganda ba'zi ma'lumotlar yo'qolishi mumkin.

0
qo'shib qo'ydi