একটি সুইচ কেস স্টেটমেন্টের জন্য দুটি মান ব্যবহার করা হচ্ছে


295

আমার কোডে, প্রোগ্রামটি ব্যবহারকারী দ্বারা প্রবেশ করা পাঠ্যের উপর নির্ভর করে কিছু করে। আমার কোডটি দেখে মনে হচ্ছে:

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

যাইহোক, ক্ষেত্রে ক্ষেত্রে কোড text1এবং text4একই। তাই আমি ভাবছিলাম যে আমার পক্ষে এরকম কিছু বাস্তবায়ন করা সম্ভব হবে কি না

case text1||text4: {
            //blah
            break;
        }

আমি জানি যে ||অপারেটর কেস স্টেটমেন্টে কাজ করবে না তবে এর মতো কিছু আছে যা আমি ব্যবহার করতে পারি।


32
একটি বেসিক প্রশ্ন হওয়ায় এটিকে আপোভেটসের জন্য আরও যোগ্য কিছু যদি এটির সদৃশ হিসাবে এটির সদৃশ না হয় makes এবং এটি এমন কিছু যা আমার পক্ষে সম্ভব হয় নি তবে এখন আমি বুঝতে পারি যে এটি অন্ধভাবে স্পষ্ট। সব মিলিয়ে একটি দুর্দান্ত ভয়ঙ্কর প্রশ্নোত্তর
রিচার্ড টিঙ্গলে

1
@RichardTingle - আপনি ডাফের এর ডিভাইস এর সাথে পরিচিত - en.wikipedia.org/wiki/Duff%27s_device
user93353

4
"কেন এত উপার্জন? ইন্টারনেটে" জাভা স্যুইচ "অনুসন্ধান করুন এবং হাজারের মধ্যে একটি ব্যাখ্যা পড়ুন" " <- আপনি কি মনে করেন আমি কি করছিলাম?
ব্রেন্ডন

4
আমি আক্ষরিকভাবে "এক লাইনে জাভাতে একাধিক কেস" অনুসন্ধান করেছি এবং এই প্রশ্নোত্তর প্রথম ফলাফল ছিল।
ডোমিনিক্স

1
বাছাই করা উত্তরের স্যুইচ ডেমোটি এখন পুনরায় সংশোধন করা যেতে পারে যে জেডিকে -12 জেপি -325 সংহত করেছে। :)
নামান

উত্তর:


555

আপনি CASEনীচের হিসাবে উভয় বিবৃতি ব্যবহার করতে পারেন ।

  case text1: 
  case text4:{
            //blah
            break;
        }

এই উদাহরণটি দেখুন: কোড উদাহরণটি একটি নির্দিষ্ট মাসে দিনের সংখ্যা গণনা করে:

class SwitchDemo {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}

এটি কোড থেকে আউটপুট:

Number of Days = 29

ব্যর্থ হত্তয়া:

আগ্রহের আরেকটি বিষয় হ'ল ব্রেক স্টেটমেন্ট। প্রতিটি ব্রেক স্টেটমেন্ট এনকোলেসিং সুইচ স্টেটমেন্টটি সমাপ্ত করে। স্যুইচ ব্লক অনুসরণ করে প্রথম বিবৃতি দিয়ে নিয়ন্ত্রণ প্রবাহ অব্যাহত থাকে। ব্রেক স্টেটমেন্টগুলি প্রয়োজনীয় কারণ এগুলি ব্যতীত, সুইচ ব্লকগুলিতে fall throughবিবৃতি: একটি ব্রেক স্টেটমেন্ট না আসা অবধি পরবর্তী কেস লেবেলগুলির অভিব্যক্তি নির্বিশেষে ম্যাচিং কেস লেবেলের পরে সমস্ত বিবৃতি ক্রমানুসারে কার্যকর করা হয়।

উদাহরণ কোড:

public class SwitchFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

এটি কোড থেকে আউটপুট:

August
September
October
November
December

স্যুইচ স্টেটমেন্টগুলিতে স্ট্রিং ব্যবহার করা

জাভা এসই 7 এবং তারপরে, আপনি স্যুইচ স্টেটমেন্টের অভিব্যক্তিতে একটি স্ট্রিং অবজেক্ট ব্যবহার করতে পারেন। নিম্নলিখিত কোড উদাহরণটি, স্ট্রিং নামক মাসের মানের উপর ভিত্তি করে মাসের সংখ্যা প্রদর্শন করে:

public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default: 
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

এই কোড থেকে আউটপুট 8 হয়।

জাভা ডক্স থেকে


ওহ ঠিক আছে. এটা সহজ. জানতাম না যে আমি এটি করতে পারি
অঙ্কুশ

18
এটি উল্লেখ করার মতো বিষয় যে এই ভাষার বৈশিষ্ট্যটিকে ফলথ্রু বলা হয়। ছাড়া মামলা breakমূলত পরবর্তী ক্ষেত্রে ব্লক যা চাক্ষুষরূপে নিচে সঙ্গে যোগ করা হয়, অত: পর পড়া মাধ্যমে।
সম্রাট ওরিওনি

5
@ কোবর ৪৪২ প্রথমে পাবলিক সাইটে কীভাবে কথা বলতে হয় তা শিখুন your আপনার পরামর্শটি কীভাবে সহায়তা করতে পারে তা ধন্যবাদ han ধন্যবাদ
পিএসআর

1
@ Kobor42 কীভাবে: আপনি কেন এই বিন্যাসটি ব্যবহার করেছেন? মামলাগুলি ভয়াবহ আকারে দেওয়া কোডটি কম পাঠযোগ্য করে তোলে এবং এটি সাধারণত খারাপ অনুশীলন হিসাবে বিবেচিত হয় [রেফারেন্স optionচ্ছিক তবে পছন্দসই]। আমি সবসময় অনুভব করেছি যে স্যুইচ স্টেটমেন্টগুলি একটি বিশেষভাবে পঠনযোগ্য ফর্ম্যাট তবে তারা উপস্থাপিত সমস্ত উপায়ে এইভাবে উপস্থাপন করেছে।
রিচার্ড টিঙ্গেল 20

2
জেডিকে -12 জেপি -325 সংহত করে এখন স্যুইচ ডেমোটি পুনঃব্যবস্থা করা যেতে পারে । :)
নামান


27

caseমান ঠিক codeless "এতে যান" পয়েন্ট যে একই এন্ট্রি পয়েন্ট ভাগ করে নিতে পারেন আছেন:

case text1:
case text4: 
    //blah
    break;

লক্ষণীয় যে বন্ধনীগুলি অপ্রয়োজনীয়।


টুইটারে আমি ইদানীং অনেক ধরণের জিনিস করছি - আইফোন থাম্ব টাইপিং দোষারোপ। চিয়ার্স
বোহেমিয়ান


15

জেডিপি 325 এর সংহতকরণের সাথে : জেডিকে -12 প্রারম্ভিক অ্যাক্সেস তৈরিতে স্যুইচ এক্সপ্রেশনস (পূর্বরূপ) , এখন কেউ সুইচ লেবেলের নতুন রূপটি ব্যবহার করতে পারে: -

case text1, text4 -> {
     //blah
} 

বা একটি উত্তর থেকে ডেমো পুনঃব্যবহার করা , এরকম কিছু:

public class RephraseDemo {

    public static void main(String[] args) {
        int month = 9;
        int year = 2018;
        int numDays = 0;

        switch (month) {
            case 1, 3, 5, 7, 8, 10, 12 ->{
                numDays = 31;
            }
            case 4, 6, 9, 11 ->{
                numDays = 30;
            }
            case 2 ->{
                if (((year % 4 == 0) &&
                        !(year % 100 == 0))
                        || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
            }
            default ->{
                System.out.println("Invalid month.");

            }
        }
        System.out.println("Number of Days = " + numDays);
    }
}

আপনি কীভাবে এটি চেষ্টা করতে পারেন তা এখানে - মাভেনের সাথে একটি জেডিকে 12 প্রিভিউ বৈশিষ্ট্যটি কম্পাইল করুন


6

বন্ধনী অপ্রয়োজনীয়। শুধু কর

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;

যদি কেউ আগ্রহী হন তবে এটাকে কেস ফ্লোথ্রু বলা হয় rough এটি করার ক্ষমতা হ'ল কারণের break;বিবরণী শেষ করতে প্রয়োজনীয়। আরও তথ্যের জন্য, উইকিপিডিয়া নিবন্ধটি http://en.wikedia.org/wiki/Switch_statement দেখুন


5

fallthroughঅন্যদের দ্বারা উত্তর ভাল বেশী।

তবে অন্য পদ্ধতির ক্ষেত্রে আপনার কেস স্টেটমেন্টের বিষয়বস্তু থেকে বের করে নেওয়ার পদ্ধতিগুলি হবে এবং তারপরে প্রতিটি কেস থেকে উপযুক্ত পদ্ধতিটি কল করুন।

নীচের উদাহরণে, কেস 'টেক্সট 1' এবং কেস 'টেক্সট 4' একই আচরণ করে:

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

আমি ব্যক্তিগতভাবে কেস স্টেটমেন্ট লেখার এই স্টাইলটি আরও রক্ষণাবেক্ষণযোগ্য এবং কিছুটা বেশি পঠনযোগ্য বলে মনে করি, বিশেষত যখন আপনি যে পদ্ধতিগুলিতে কল করেন তার বর্ণনামূলক ভাল নাম থাকে।


1
এটা তোলে যদি আরো রক্ষণীয় নয় text1এবং text4প্রায় অবশ্যই একই জিনিস ভবিষ্যতে পরিবর্তন নির্বিশেষে চেষ্টা করতে হবে। যদি তাদের সর্বদা সংযুক্ত করা উচিত, তবে ক্ষেত্রে ক্ষেত্রে text1পরিবর্তন করার অর্থ (এটি যে পদ্ধতিটিকে কল করে) পরিবর্তনের প্রয়োজন হবে text4। এই ক্ষেত্রে এটি সম্ভবত আরও রক্ষণাবেক্ষণযোগ্য নয়। এটা পরিস্থিতির উপর নির্ভর করে।
নিক ফ্রিম্যান

1
আমি বলব যে এই পদ্ধতিটি সম্ভবত অন্যভাবে সংযুক্ত করা উচিত, যেহেতু স্যুইচ স্টেটমেন্টগুলি (আইএমএইচও) সবচেয়ে সুন্দর প্রোগ্রামিং কাঠামো নয়।
নিক ফ্রিম্যান



4

কেস মানগুলি কেবল কোডলেস "গোটো" পয়েন্ট যা একই প্রবেশের পয়েন্টটি ভাগ করতে পারে:

কেস
টেক্সট 1: কেস টেক্সট 4: {
// কিছু
বিরতি করুন;
}

লক্ষণীয় যে বন্ধনীগুলি অপ্রয়োজনীয়।


1

জেপি ৩৪৪: জেডিকে -১ Switch এ স্যুইচ এক্সপ্রেশনস (পূর্বরূপ) এবং জেইপি ৩1১: জেডিকে -১ in এ স্যুইচ এক্সপ্রেশনস (স্ট্যান্ডার্ড) সুইচ স্টেটমেন্টটি প্রসারিত করবেযাতে এটি একটি এক্সপ্রেশন হিসাবে ব্যবহার করা যায়।

এখন তুমি পার:

  • সুইচ এক্সপ্রেশন থেকে সরাসরি পরিবর্তনশীল বরাদ্দ করুন ,
  • নতুন ফর্মটি স্যুইচ লেবেল ব্যবহার করুন ( case L ->):

    "কেস এল ->" স্যুইচ লেবেলের ডানদিকে কোডটি এক্সপ্রেশন, ব্লক বা (সুবিধার জন্য) একটি থ্রো স্টেটমেন্ট হিসাবে সীমাবদ্ধ।

  • প্রতি ক্ষেত্রে একাধিক ধ্রুবক ব্যবহার করুন, কমা দ্বারা আলাদা,
  • এবং আরও কোনও মান বিরতি নেই :

    একটি স্যুইচ এক্সপ্রেশন থেকে একটি মান উপার্জন করতে, breakমান বিবৃতি সহ একটি yieldস্টেটমেন্টের পক্ষে বাদ দেওয়া হয় ।

সুতরাং উত্তরগুলির মধ্যে একটি থেকে ডেমো দেখতে দেখতে এটির মতো হতে পারে:

public class SwitchExpression {

  public static void main(String[] args) {
      int month = 9;
      int year = 2018;
      int numDays = switch (month) {
        case 1, 3, 5, 7, 8, 10, 12 -> 31;
        case 4, 6, 9, 11 -> 30;
        case 2 -> {
          if (java.time.Year.of(year).isLeap()) {
            System.out.println("Wow! It's leap year!");
            yield 29;
          } else {
            yield 28;
          }
        }
        default -> {
          System.out.println("Invalid month.");
          yield 0;
        }
      };
      System.out.println("Number of Days = " + numDays);
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.