java jdk আমি কীভাবে জাভা পদ্ধতিতে অকেজো রিটার্ন এড়াব?



java software download (8)

যেহেতু আপনি দুটি লুপের for পৃথকীকরণ সম্পর্কে জিজ্ঞাসা করেছেন, আপনি এটি করতে একটি লেবেল ব্যবহার করতে পারেন (নীচের উদাহরণটি দেখুন):

private static int oneRun(int range) {
    int returnValue=-1;

    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    OUTER: for (int count = 1; count <= range; count++) { // Run until return.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.   
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                returnValue = count;
                break OUTER;
            }
        }
    }
    return returnValue;
}

আমার এমন একটি পরিস্থিতি রয়েছে যেখানে তাত্ত্বিকভাবে লুপের for দু'জনে return স্টেটমেন্টটি পৌঁছে যাবে।

সংকলক একমত নয় এবং লুপের বাইরে একটি বিবরণী বিবৃতি প্রয়োজন requires আমি আমার বর্তমান বোধগম্যের বাইরে এই পদ্ধতিটি অনুকূলকরণের জন্য একটি মার্জিত উপায় জানতে চাই এবং আমার বিরতির বাস্তবায়নের কোনওটিই কাজ করছে বলে মনে হয় না।

সংযুক্তি একটি অ্যাসাইনমেন্ট থেকে একটি পদ্ধতি যা র্যান্ডম পূর্ণসংখ্যার উত্পন্ন করে এবং দ্বিতীয় র্যান্ডম পূর্ণসংখ্যার সন্ধান না পাওয়া অবধি চক্রের পুনরাবৃত্তিগুলি প্রদান করে, কোনও পদ্ধতিটি প্যারামিটার হিসাবে পদ্ধতিতে পাস করা একটি পরিসরের মধ্যে উত্পন্ন হয়।

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range; count++) { // Run until return.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                return count;
            }
        }
    }
    return 0; // Never reached
}

Answer #1

একটি টেম্প ভেরিয়েবল ব্যবহার করুন, উদাহরণস্বরূপ "ফলাফল" এবং অভ্যন্তরীণ রিটার্নটি সরিয়ে দিন। সঠিক অবস্থার সাথে লুপের জন্য কিছুক্ষণ পরিবর্তন করুন। আমার কাছে ফাংশনের সর্বশেষ বিবৃতি হিসাবে কেবলমাত্র একটি রিটার্ন পাওয়া সবসময়ই মার্জিত।


Answer #2

সংকলকের হিউরিস্টিকস আপনাকে শেষ রিটার্নটি বাদ দিতে দেয় না। আপনি যদি নিশ্চিত হন যে এটি কখনই throw না, তবে পরিস্থিতি স্পষ্ট করার জন্য আমি একটি throw দিয়ে প্রতিস্থাপন করব।

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range; count++) {
        ...
    }

    throw new AssertionError("unreachable code reached");
}

Answer #3

@ বোরিস্টস্পাইডারটি যেমন উল্লেখ করেছেন যে আপনি দ্বিতীয় return বিবৃতিটি শব্দার্থগতভাবে পৌঁছনীয় নয় তা নিশ্চিত করতে পারেন:

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    int count = 0;

    while (true) {
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                return count;
            }
        }
        count++;
    }
}

সংকলন এবং জরিমানা রান। এবং যদি আপনি কোনও ArrayIndexOutOfBoundsException পান তবে আপনি অবশ্যই জানবেন যে বাস্তবায়নটি স্পষ্টতই কিছু ছুঁড়ে না ArrayIndexOutOfBoundsException শব্দার্থগতভাবে ভুল ছিল।


Answer #4

আপনার রিটার্নের মান বাইরের লুপের ভেরিয়েবলের উপর ভিত্তি করে আপনি কেবল count < range করে বাহ্যিক লুপের শর্তটি পরিবর্তন করতে পারেন এবং তারপরে ফাংশনের শেষে এই শেষ মানটি (যা আপনি কেবল বাদ দিয়েছেন) ফিরে আসতে পারেন:

private static int oneRun(int range) {
    ...

    for (int count = 1; count < range; count++) {
        ...
    }
    return range;
}

এইভাবে আপনাকে এমন কোড প্রবর্তনের দরকার নেই যা কখনই পৌঁছাতে পারে না।


Answer #5
private static int oneRun(int range) {
    int result = -1; // use this to store your result
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range && result == -1; count++) { // Run until result found.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.   
        for (int i = 0; i < count && result == -1; i++) { // Check for past occurence and leave after result found.
            if (rInt[i] == rInt[count]) {
                result = count;
            }
        }
    }
    return result; // return your result
}

Answer #6

যদিও একটি জোর দেওয়া ভাল দ্রুত সমাধান solution সাধারণভাবে এই ধরণের সমস্যার অর্থ হল আপনার কোডটি খুব জটিল। আমি যখন আপনার কোডটি দেখছি, এটি স্পষ্টতই আপনি পূর্ববর্তী সংখ্যাগুলি ধরে রাখতে কোনও অ্যারে চান না। আপনি একটি Set চান:

Set<Integer> previous = new HashSet<Integer>();

int randomInt = generator.nextInt(range);
previous.add(randomInt);

for (int count = 1; count <= range; count++) {
    randomInt = generator.nextInt(range);
    if (previous.contains(randomInt)) {
       break;
    }

    previous.add(randomInt);
}

return previous.size();

এখন নোট করুন যে আমরা ফিরে যাচ্ছি তা আসলে সেটটির আকার। কোড জটিলতা চতুর্ভুজ থেকে লিনিয়ারে হ্রাস পেয়েছে এবং এটি অবিলম্বে আরও পঠনযোগ্য।

এখন আমরা বুঝতে পারি যে আমাদের সেই count দরকার নেই:

Set<Integer> previous = new HashSet<Integer>();

int randomInt = generator.nextInt(range);

while (!previous.contains(randomInt)) {          
    previous.add(randomInt);      
    randomInt = generator.nextInt(range);
}

return previous.size();

Answer #7

হতে পারে এটি একটি ইঙ্গিত যা আপনার কোডটি পুনরায় লিখতে হবে। উদাহরণ স্বরূপ:

  1. পূর্ণসংখ্যার 0 .. রেঞ্জ -1 এর অ্যারে তৈরি করুন। সমস্ত মান 0 তে সেট করুন।
  2. একটি লুপ সঞ্চালন। লুপে, একটি এলোমেলো সংখ্যা তৈরি করুন। আপনার তালিকায়, সেই সূচীতে দেখুন, মানটি 1 হয় কিনা তা দেখতে লুপটি ভেঙে দিন। অন্যথায়, সেই সূচকের মানটি 1 তে সেট করুন
  3. তালিকায় 1 টি সংখ্যা গণনা করুন এবং সেই মানটি ফিরিয়ে দিন।




java