প্রতিটি ক্ষেত্রে মানের একটি সীমা সহ স্যুইচ স্টেটমেন্ট ব্যবহার করছেন?


94

জাভাতে, যেখানে প্রতিটি ক্ষেত্রে একাধিক মান থাকে সেখানে একটি সুইচ বিবৃতি লেখা সম্ভব? উদাহরণস্বরূপ (যদিও পরিষ্কারভাবে নিম্নলিখিত কোডটি কাজ করবে না):

switch (num) {
    case 1 .. 5:
        System.out.println("testing case 1 to 5");
        break;
    case 6 .. 10:
        System.out.println("testing case 6 to 10");
        break;
}

আমি মনে করি এটি উদ্দেশ্য সিতে করা যেতে পারে, জাভাতে কি একই রকম জিনিস রয়েছে? অথবা আমি শুধু ব্যবহার করা উচিত if, else ifপরিবর্তে বিবৃতি?


এমনকি প্লেইন সি-তে এক্সটেনশন রয়েছে যা এর জন্য অনুমতি দেয়।
আর্শাজি

সেক্ষেত্রে সম্ভবত if/elseএকটি ভাল সমাধান।
এরিক ওয়াং

উত্তর:


100

জাভাতে এই ধরণের কিছুই নেই। শুধু নিম্নলিখিতগুলি না কেন?

public static boolean isBetween(int x, int lower, int upper) {
  return lower <= x && x <= upper;
}

if (isBetween(num, 1, 5)) {
  System.out.println("testing case 1 to 5");
} else if (isBetween(num, 6, 10)) {
  System.out.println("testing case 6 to 10");
}

4
এটি দুর্দান্ত কাজ করে এবং সহজ। এছাড়াও আপনি যদি পরিসরে না থেকে সংখ্যাগুলি নির্বাচন করতে চান তবে আপনার যদি প্রয়োজন হয় তা হ'ল (! বিটুইন ... ... ভাল কাজ
a54 স্টুডিও

4
@ মিসিংফ্যাক্টর আমি আপনার উত্তরের কিছুটা সমালোচনা করেছি সুতরাং, আপনি সম্ভবত কিছু উত্তর দিতে চাইবেন। যদিও +1
আলেকজান্ডার মালাখভ

@ এমসিসি সম্রাট, আপনার ব্যক্তিগত ফর্ম্যাটিং পছন্দগুলি দিয়ে আমার উত্তরটি সম্পাদনা করবেন না। এটি কোনও দরকারী সম্পাদনা নয়।
মিসিংফ্যাক্টর

দুঃখিত তবে সেই সম্পাদনাটি অনেক আগে অনুমোদিত হয়েছিল; আমি কখনও মনে করি না যে আমি এটি করেছিলাম।
এমসির সম্রাট

77

switchবিবৃতিগুলির সাথে আপনি যে ধরণের আচরণের নিকটতম হন তা হ'ল

switch (num) {
case 1:
case 2:
case 3:
case 4:
case 5:
     System.out.println("1 through 5");
     break;
case 6:
case 7:
case 8:
case 9:
case 10:
     System.out.println("6 through 10");
     break;
}

ifবিবৃতি ব্যবহার করুন ।


30

অন্যান্য বিকল্প গণিত অপারেশনকে এটির ভাগ করে উদাহরণস্বরূপ:

switch ((int) num/10) {
    case 1:
        System.out.println("10-19");
        break;
    case 2:
        System.out.println("20-29");
        break;
    case 3:
        System.out.println("30-39");
        break;
    case 4:
        System.out.println("40-49");
        break;
    default:
        break;
}

তবে, আপনি দেখতে পাচ্ছেন এটি কেবল তখনই ব্যবহার করা যেতে পারে যখন প্রতিটি ক্ষেত্রে ব্যাপ্তি স্থির হয়।


6
এই HTTP স্থিতি দ্বারা 100 বিভক্ত কোড সঙ্গে চমত্কারভাবে কাজ করে
স্টিফান

14

আমি মনে করি না আপনি জাভাতে এটি করতে পারেন। সেরা বাজি হ'ল সীমাটির শেষ ক্ষেত্রে কোডটি রাখা।

switch (num) {
  case 1: case 2: case 3: case 4: case 5: 
     System.Out.Println("testing case 1 to 5");
     break;
  case 6: case 7: case 8: case 9: case 10:
     System.Out.Println("testing case 6 to 10");
     break;
  default:
     //
}

11

আমি জানি এই পোস্টটি পুরানো তবে আমি বিশ্বাস করি যে এই উত্তরটি কিছু স্বীকৃতির দাবিদার। সুইচ স্টেটমেন্ট এড়াতে হবে না। এটি জাভাতে করা যেতে পারে তবে সুইচ স্টেটমেন্টের মাধ্যমে, কেসগুলি নয়। এটি টার্নারি অপারেটর ব্যবহার জড়িত।

public class Solution {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = Integer.parseInt(sc.nextLine());

        switch ((1 <= num && num <= 5 ) ? 0 :
                (6 <= num && num <= 10) ? 1 : 2) {

            case 0:
                System.out.println("I'm between one and five inclusive.");
                break;
            case 1:
                System.out.println("I'm between 6 and 10 inclusive.");
                break;
            case 2:
                System.out.println("I'm not between one and five or 6 and 10 inclusive.");
                break;
        }
    }
}

4
চমৎকার সমাধান! জাভা 7 এবং উচ্চতর দিয়ে আপনি একটি স্ট্রিং স্যুইচ করতে পারেন যাতে আপনার কেসগুলি আরও বেশি স্ব-ডকুমেন্টিং হয়, যেমন, switch ((1 <= num && num <= 5 ) ? "1 .. 5" : ...এবং তারপরে case "1 .. 5":
ড্যানিয়েল উইদিস

@ ড্যানিয়েলভিডিস: ধারাবাহিকতা নিশ্চিত করার জন্য আমি স্ট্রিংয়ের পরিবর্তে এনাম ব্যবহার করার পরামর্শ দেব।
nmatt

@ এনম্যাট সাধারণভাবে সম্মত হন। আমি "1 .. 5" স্টাইল সিনট্যাক্স ব্যবহারের অনুমতি দেওয়ার চেষ্টা করছিলাম।
ড্যানিয়েল উইদিস

4
@ ড্যানিয়েলভিডিস: অবশ্যই একটি ভাল জিনিস; আমি এন্রাম কনস্ট্যান্টদের নাম দেব FROM_1_TO_5 এর মতো something সাধারণত রেঞ্জগুলির একটি নির্দিষ্ট অর্থ থাকে এবং সেই ক্ষেত্রে এনাম ধ্রুবকের পরিসীমাটির অর্থ অনুসারে নামকরণ করা যায়।
nmatt

4
আমি মনে করি আমরা সম্মত করতে পারেন পারেন বিকল্প চেয়ে ভাল 0, 1, বা 2 হয়
ড্যানিয়েল Widdis

10
  case 1: case 2: case 3: case 4: case 5: 
         System.out.println("testing case 1 to 5");
         break;
  case 6: case 7: case 8: case 9: case 10:
         System.out.println("testing case 6 to 10");
         break;
  default:
         System.out.println("default"); 

6

অথবা আপনি উদ্দেশ্য হিসাবে আপনার একক কেসগুলি ব্যবহার করতে পারেন এবং সীমার নির্দেশাবলী নির্দিষ্ট করতে আপনার ডিফল্ট কেসটি ব্যবহার করতে পারেন:

switch(n) {
    case 1 : System.out.println("case 1"); break;
    case 4 : System.out.println("case 4"); break;
    case 99 : System.out.println("case 99"); break;
    default :
        if (n >= 10 && n <= 15)
            System.out.println("10-15 range"); 
        else if (n >= 100 && n <= 200)
            System.out.println("100-200 range");
        else
            System.out.println("Your default case");
        break;   
}

আমি সর্বদা এটিই করি, তবে ক্ষেত্রেগুলির মধ্যে একটি মন্তব্যও যুক্ত করুন, যেমন: // 10 - 15 ডিফল্ট নীচে দেখুন
পেরেডি এস্তাকেল

5

যদি আপনার অবশ্যই স্যুইচ ব্যবহার করা হয় তবে এটি চেষ্টা করুন।

public static int range(int num){ 
    if ( 10 < num && num < 20)
        return 1;
    if ( 20 <= num && num < 30)
        return 2;
    return 3;
}

public static final int TEN_TWENTY = 1;
public static final int TWENTY_THIRTY = 2;

public static void main(String[]args){
    int a = 110;
    switch (range(a)){
        case TEN_TWENTY: 
            System.out.println("10-20"); 
            break;
        case TWENTY_THIRTY: 
            System.out.println("20-30"); 
            break;
        default: break;
    }
}

আপনি কি দয়া করে ব্যাখ্যা দিতে পারেন ..?
ব্যবহারকারী 1140237

ফাংশন পরিসরটি ইনপুট আর্গুমেন্ট অনুসারে কিছু মান ফেরত দেয়, তাই স্যুইচ কেস ক্লজ সহ মিলিয়ে এখানে "মানের পরিসর" সনাক্তকরণ করা যায়।
zl9394

এটি আমার ব্যবহারের ক্ষেত্রে কাজ করা হয়েছে, আমার কাছে 2 টি ভেরিয়েবল রয়েছে এবং আমি যাচাই করতে চাই যে 2 ভেরিয়েবল (10-10), (20-30), .... এর মতো একই পরিসরে রয়েছে
সমীর কাজী

আমি যাদু ইন মানগুলির পরিবর্তে এনাম ব্যবহার করার পরামর্শ দেব।
nmatt

4

না আপনি এটা করতে পারবেন না। আপনি সবচেয়ে ভাল করতে পারেন

case 1:
case 2:
case 3:
case 4:
case 5: 
  System.Out.Println("testing case 1 to 5");
break;

4

এখানে যেতে একটি সুন্দর এবং নূন্যতম উপায়

(num > 1 && num < 5) ? first_case_method() 
                     : System.out.println("testing case 1 to 5")
                     : (num > 5 && num < 7)  ? System.out.println("testing case 5 to 7") 
                     : (num > 7 && num < 8)  ? System.out.println("testing case 7 to 8") 
                     : (num > 8 && num < 9)  ? System.out.println("testing case 8 to 9") 
                     : ... 
                     : System.out.println("default");

আপনি এই ব্যাখ্যা করতে পারেন ?? - আমি 'মিনি আইএফএস' পাই কিন্তু আইডিকে ছাড়া অন্য কিছু।
কামিন পল্ল্যাগি

@ তুনাকী এটি if..elseifক্যাসকেড টের্নারি অপারেটর ( condition ? statementIfTrue : statementIfFalse) ব্যবহার করে একটি বিকল্প ।
উইলিয়াম

3

স্যুইচ বিবৃতি দ্বারা অনুমোদিত দ্বারা পতনেরcase প্রক্রিয়াটি ব্যবহার করে একই বিবৃতিতে বেশ কয়েকটি শর্তকে গোষ্ঠীভুক্ত করা সম্ভব , এটি জাভা টিউটোরিয়ালে উল্লিখিত এবং বিভাগে পুরোপুরি সুনির্দিষ্টভাবে বলা হয়েছে -১.1.১১। সুইচ বিবৃতি এর জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন

টিউটোরিয়ালের একটি উদাহরণ থেকে নিম্নলিখিত কোডের স্নিপেট নেওয়া হয়েছিল, এটি প্রতিটি মাসে কত দিনের সংখ্যা গণনা করে (1 মাস থেকে 12 মাস পর্যন্ত গণনা করা হয়):

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

যেমন আপনি দেখতে পাচ্ছেন, একক caseবিবৃতিতে বিভিন্ন মানের মান আচ্ছাদন করার জন্য একের পর এক সম্ভাব্য মানকে পৃথকভাবে তালিকাভুক্ত করার একমাত্র বিকল্প হ'ল। অতিরিক্ত উদাহরণ হিসাবে, প্রশ্নটিতে সিউডোকোড কীভাবে প্রয়োগ করা যায় তা এখানে:

switch(num) {
    case 1: case 2: case 3: case 4: case 5:
        System.out.println("testing case 1 to 5");
        break;
    case 6: case 7: case 8: case 9: case 10:
        System.out.println("testing case 6 to 10");
        break;
}

3

আপনি enumআপনার ব্যাপ্তি উপস্থাপন করতে একটি ব্যবহার করতে পারেন ,

public static enum IntRange {
  ONE_TO_FIVE, SIX_TO_TEN;
  public boolean isInRange(int v) {
    switch (this) {
    case ONE_TO_FIVE:
      return (v >= 1 && v <= 5);
    case SIX_TO_TEN:
      return (v >= 6 && v <= 10);
    }
    return false;
  }

  public static IntRange getValue(int v) {
    if (v >= 1 && v <= 5) {
      return ONE_TO_FIVE;
    } else if (v >= 6 && v <= 10) {
      return SIX_TO_TEN;
    }
    return null;
  }
}

3

এটি জাভা ১২ হিসাবে সমর্থিত J জেপি 354 দেখুন । এখানে কোনও "ব্যাপ্তি" সম্ভাবনা নেই, তবে এটি কার্যকরও হতে পারে।

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);//number of letters
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

আপনি এটি ints উপর কার্যকর করতে সক্ষম হওয়া উচিত। এর মাধ্যমে নোট করুন যে আপনার সুইচ বিবৃতিটি সম্পূর্ণরূপে ( defaultকীওয়ার্ড ব্যবহার করে , বা কেস স্টেটমেন্টে সমস্ত সম্ভাব্য মান ব্যবহার করা উচিত) হতে হবে।


2

@ মিসিংফ্যাক্টর এর উত্তরটি অবশ্যই সঠিক তবে কিছুটা জটিল। কোডটি আরও ভার্বোজ হয় (কমপক্ষে ধারাবাহিক ব্যবধানের জন্য) তবে এটি হতে পারে এবং দীর্ঘ, ভাসা, পূর্ণসংখ্যার ইত্যাদির জন্য ওভারলোড / ক্যাসেট এবং / অথবা পরামিতি প্রয়োজন requires

if (num < 1)
    System.Out.Println("invalid case: " + num); // you should verify that anyway
else if (num <= 5)
    System.Out.Println("1 to 5");
else if (num <= 10)
    System.Out.Println("6 to 10");
else if (num <= 42)
    System.Out.Println("11 to 42");
else    
    System.Out.Println("43 to +infinity");

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

4
ওভারলোডস এবং ক্যাসেটের প্রয়োজনীয়তা হিসাবে এটি কোনও বৈধ সমালোচনা আইএমও নয়। জাভাতে এই ধরণের পদ্ধতির চেয়ে জাভাটির সীমাবদ্ধতা সম্পর্কে আরও বেশি বলা হয়েছে যে সংখ্যাসূচক প্রকারের দ্বারা জাভাতে বিমূর্ত করার কোনও বুদ্ধিমান উপায় নেই। আপনি Numযদি এই বিষয়টিকে আরও ভালভাবে বুঝতে চান তবে আপনি হাস্কেলের টাইপ-ক্লাসটি ঘুরে দেখতে চাইতে পারেন।
মিসিংফ্যাক্টর

@ মিসিংফ্যাক্টর ১. আমার ধারণা এটি স্বাদের বিষয় of অবিচ্ছিন্ন বিরতি নিয়ে কাজ করার সময় আমি ব্যক্তিগতভাবে এগুলি ভাবতে পছন্দ করি ifযেন আমি ধীরে ধীরে নিম্ন সাব্রিনেজকে ছড়িয়ে দিই। উপরন্তু, একটি অপ্রয়োজনীয় গণনার এ সব সময় একটি সমস্যা নয়, কিন্তু অপ্রয়োজনীয় তুলনা একটু উদ্বেগজনক: এটি কিছু সম্পাদনার পরে সিঙ্ক, যেমন বাইরে সন্নিহিত তুলনা করতে সহজ পায়: if (isBetween(x, 1, 4)) {...} else if (isBetween(x, 6, 10))। যাইহোক, কোনও বড় বিষয় নয়।
আলেকজান্ডার মালাখভ

২. সম্মত - জাভার সীমাবদ্ধতা, তবে এটি যা আমাদের সাথে কাজ করতে হবে এবং আপনার মূল কোডটি বিভিন্ন ধরণের জন্য নকল হবে। এই বিশেষ ক্ষেত্রে সংখ্যা ক্লাস ব্যবহার করে সমস্যাটি হ্রাস করা যেতে পারে , যদিও হাস্কেলের দৃষ্টিভঙ্গি আরও ভাল (আসলেই হাস্কেল শিখতে আসেনি, তবে এটি সি ++ এর "কনসেপ্টস লাইট" এর সাথে সাদৃশ্যযুক্ত। এছাড়াও আমি বিশ্বাস করি যে আপনি বোঝাতে চেয়েছিলেন Real, না Num)।
আলেকজান্ডার মালাখভ

2

NavigableMapমত একটি বাস্তবায়ন ব্যবহার করুন TreeMap

/* Setup */
NavigableMap<Integer, Optional<String>> messages = new TreeMap<>();
messages.put(Integer.MIN_VALUE, Optional.empty());
messages.put(1, Optional.of("testing case 1 to 5"));
messages.put(6, Optional.of("testing case 6 to 10"));
messages.put(11, Optional.empty());

/* Use */
messages.floorEntry(3).getValue().ifPresent(System.out::println);

দুর্দান্ত সমাধান! if (messages.floorEntry(value)!=null) আপনি যদি পূর্ণসংখ্যার মানটি ব্যবহার করেন তবে নাল ব্যবহার করে তা পরীক্ষা করতে ভুলবেন না
Ch Vas

4
@ সিএইচভিএস এখানে মানচিত্রটি যেভাবে সেট আপ করা হয়েছে floorEntry()তা কখনই ফিরে আসবে না null( Integer.MIN_VALUEকী সন্নিবেশ করানো তা রোধ করার উদ্দেশ্যে করা হয়েছে)। তবে, আপনার মানের ধরণ নির্বিশেষে, আপনাকে বৈধ সীমার বাইরে কী কীভাবে পরিচালনা করতে হবে তা সিদ্ধান্ত নেওয়া দরকার।
এরিকসন

0

০.১০০ পরিসরে ইনপুট সংখ্যার জন্য

int n1 = 75; // input value
String res; int n=0; 
int[] a ={0,20,35,55,70,85,101};

for(; n1>=a[n]; n++);
switch(6-n+1) {
  case 1: res="A"; break;
  case 2: res="B"; break;
  case 3: res="C"; break;
  case 4: res="D"; break;
  case 5: res="E"; break;
  default:res="F";
}
System.out.println(res);

0

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.