কোন স্ট্রিং লোয়ার কেস এর প্রথম চরিত্রটি তৈরি করার সর্বাধিক দক্ষ উপায়?


102

Stringলোয়ার কেসের প্রথম চরিত্রটি তৈরি করার সর্বাধিক দক্ষ উপায় কোনটি ?

আমি এটি করার বিভিন্ন উপায় সম্পর্কে ভাবতে পারি:

সাথে ব্যবহার charAt()করাsubstring()

String input   = "SomeInputString";
String output  = Character.toLowerCase(input.charAt(0)) +
                   (input.length() > 1 ? input.substring(1) : "");

বা একটি charঅ্যারে ব্যবহার করে

 String input  = "SomeInputString";
 char c[]      = input.toCharArray();
 c[0]          = Character.toLowerCase(c[0]);
 String output = new String(c);

আমি নিশ্চিত যে এটি অর্জনের জন্য আরও অনেক দুর্দান্ত উপায় রয়েছে। আপনি কি সুপারিশ করেন?


সম্ভব হলে আপনার প্রয়োজনীয়তা পরিবর্তন করা সবচেয়ে ভাল উপায়। স্ট্রিংয়ের পরিবর্তে একটি স্ট্রিংবিল্ডার গ্রহণ করুন এবং আপনি এটি সরাসরি সংশোধন করতে পারেন।
মার্ক পিটারস

তবে এটি কোনও উত্তর নয় কারণ এটি জাভার বাইরে, এবং এটি ASCII এনকোডিং এবং এই চরিত্রটি ইতিমধ্যে বর্ণমালার উপর নির্ভর করে। এটি একটি পুরানো টাইমার হ্যাক:c[0] |= ' ';
মাইক ডুনলাভে


এটি একটি পৃথক প্রশ্ন
অ্যান্ডি

উত্তর:


127

আমি জেএমএইচ ব্যবহার করে প্রতিশ্রুতিবদ্ধ পদ্ধতির পরীক্ষা করেছি । পূর্ণ মাপদণ্ডের কোড

পরীক্ষাগুলির সময় অনুমান (প্রতিবার কোণার কেসগুলি পরীক্ষা করা এড়াতে): ইনপুট স্ট্রিংয়ের দৈর্ঘ্য সর্বদা 1 এর চেয়ে বেশি থাকে।

ফলাফল

Benchmark           Mode  Cnt         Score        Error  Units
MyBenchmark.test1  thrpt   20  10463220.493 ± 288805.068  ops/s
MyBenchmark.test2  thrpt   20  14730158.709 ± 530444.444  ops/s
MyBenchmark.test3  thrpt   20  16079551.751 ±  56884.357  ops/s
MyBenchmark.test4  thrpt   20   9762578.446 ± 584316.582  ops/s
MyBenchmark.test5  thrpt   20   6093216.066 ± 180062.872  ops/s
MyBenchmark.test6  thrpt   20   2104102.578 ±  18705.805  ops/s

স্কোর প্রতি সেকেন্ডে অপারেশন হয়, আরও ভাল।

পরীক্ষা

  1. test1 প্রথম অ্যান্ডির এবং হিলিংকের পন্থা ছিল:

    string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
    
  2. test2দ্বিতীয় অ্যান্ডির পদ্ধতির ছিল। এটি Introspector.decapitalize()ড্যানিয়েল দ্বারাও প্রস্তাবিত, তবে দুটি ifবক্তব্য ছাড়াই । ifপরীক্ষার অনুমানের কারণে প্রথমে সরানো হয়েছিল। দ্বিতীয়টি সরানো হয়েছে, কারণ এটি যথার্থতা লঙ্ঘন করছে (অর্থাত ইনপুট "HI"ফিরে আসবে "HI")। এটি প্রায় দ্রুততম ছিল।

    char c[] = string.toCharArray();
    c[0] = Character.toLowerCase(c[0]);
    string = new String(c);
    
  3. test3এর একটি পরিবর্তন ছিল test2, তবে পরিবর্তে Character.toLowerCase()আমি 32 যোগ করছি, যা স্ট্রিং ASCII এ থাকলে এবং যদি সঠিকভাবে কাজ করে। এটি ছিল দ্রুততম। c[0] |= ' 'মাইকের মন্তব্য থেকে একই পারফরম্যান্স দেওয়া হয়েছে।

    char c[] = string.toCharArray();
    c[0] += 32;
    string = new String(c);
    
  4. test4ব্যবহৃত StringBuilder

    StringBuilder sb = new StringBuilder(string);
    sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
    string = sb.toString();
    
  5. test5দুটি substring()কল ব্যবহৃত ।

    string = string.substring(0, 1).toLowerCase() + string.substring(1);
    
  6. test6স্ট্রিংয়ে char value[]সরাসরি পরিবর্তন করতে প্রতিবিম্ব ব্যবহার করে । এটি সবচেয়ে ধীর ছিল।

    try {
        Field field = String.class.getDeclaredField("value");
        field.setAccessible(true);
        char[] value = (char[]) field.get(string);
        value[0] = Character.toLowerCase(value[0]);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
    

সিদ্ধান্তে

যদি স্ট্রিংয়ের দৈর্ঘ্য সর্বদা 0 এর চেয়ে বেশি থাকে তবে ব্যবহার করুন test2

যদি তা না হয় তবে আমাদের কোণার কেসগুলি পরীক্ষা করতে হবে:

public static String decapitalize(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }

    char c[] = string.toCharArray();
    c[0] = Character.toLowerCase(c[0]);

    return new String(c);
}

আপনি যদি নিশ্চিত হন যে আপনার পাঠ্যটি সর্বদা ASCII তে থাকবে এবং আপনি চূড়ান্ত পারফরম্যান্সের সন্ধান করছেন কারণ আপনি এই কোডটি বাটনেলে খুঁজে পেয়েছেন, ব্যবহার করুন test3


95

আপনি যদি কোনও তৃতীয় পক্ষের লাইব্রেরিটি ব্যবহার না করতে চান তবে আমি একটি দুর্দান্ত বিকল্প পেয়েছি:

import java.beans.Introspector;

Assert.assertEquals("someInputString", Introspector.decapitalize("SomeInputString"));

14
এই পদ্ধতির জন্য দস্তাবেজ থেকে: "এর অর্থ সাধারণত প্রথম অক্ষরটিকে আপার কেস থেকে নিম্নের ক্ষেত্রে রূপান্তর করা হয়, তবে (অস্বাভাবিক) বিশেষ ক্ষেত্রে যখন একের বেশি অক্ষর থাকে এবং প্রথম এবং দ্বিতীয় অক্ষর উভয়ই উচ্চতর ক্ষেত্রে থাকে, আমরা ছেড়ে যাই এটা একা। "
অ্যান্ডি

4
এছাড়াও, উত্সটির দিকে তাকিয়ে, একবার এই পদ্ধতিটি আমার পূর্ববর্তী মন্তব্যে বর্ণিত বিশেষ কেসটি পরিচালনা করে, এটি কেবল আমার প্রশ্নে উল্লিখিত চর চরটি ব্যবহার করে uses
অ্যান্ডি

4
ঠিক আমার যা প্রয়োজন ছিল। ইন্ট্রোস্পেক্টর.ডেকাপিটালাইজ ("এবিসি") এখনও এবিসি হবে। ওয়ার্ড ইউটিলস.উনকাপিটালাইজ ("এবিসি") "এবিসি" উত্পাদন করে। কেবল ভাগ করে নেওয়া যে প্রবীণ হ'ল কীভাবে বসন্ত তার শিমের স্বায়ত্তশাসন করে be
গ্রামবাসী

21

স্ট্রিং ম্যানিপুলেশনের বিষয়টি যখন জাকার্তা কমন্স ল্যাং স্ট্রিং ইউটিলে দেখুন


8
আরও সুনির্দিষ্টভাবে বলা যায় যে স্ট্রিংগটিলগুলি ব্যবহার করে পদ্ধতিটি বেঁধে দেওয়া হয়েছে (java.lang.String) আপনার কোডটিতে নালপয়েন্টার এক্সেকশন সম্পর্কে চিন্তা না করার অতিরিক্ত সুবিধা রয়েছে has
হেক্সিয়াম

4
অগত্যা সবচেয়ে দক্ষ নয়, তবে সম্ভবত সবচেয়ে পরিষ্কার, যা অনেকের জন্য গণনা করা হয়।
ডেভিড গেলহার

4
আপনি কী উত্সকে আরও দক্ষ করে তুলছেন তা নির্ভর করে - সিপিইউ বা প্রোগ্রামার সময় :)
ড্যান গ্র্যাভেল

15

আপনি যদি অ্যাপাচি কমন্স ব্যবহার করতে চান তবে নিম্নলিখিতগুলি করতে পারেন:

import org.apache.commons.lang3.text.WordUtils;
[...] 
String s = "SomeString"; 
String firstLower = WordUtils.uncapitalize(s);

ফলাফল: কিছু স্ট্রিং


4
এটি দুর্দান্ত এবং পরিষ্কার সমাধান, তবে এটি এখন compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'
অবচয়

10

চর-ওরিয়েন্টেড পদ্ধতির পরেও আমি একটি স্ট্রিং ওরিয়েন্টেড সমাধানের পরামর্শ দেব। স্ট্রিং.টোলওয়ারকেস স্থানীয়ভাবে নির্দিষ্ট, তাই আমি এই বিষয়টি আমলে নেব। ক্যারেক্টার . String.toLowerCaseটোলওয়ারক্যাস অনুসারে লোয়ার-কেসিংয়ের জন্য পছন্দ করা । এছাড়াও একটি চর-ভিত্তিক সমাধান সম্পূর্ণ ইউনিকোড সামঞ্জস্যপূর্ণ নয়, কারণ ক্যারেক্টার . টোলওয়ারক্যাস পরিপূরক অক্ষরগুলি পরিচালনা করতে পারে না।

public static final String uncapitalize(final String originalStr,
            final Locale locale) {
        final int splitIndex = 1;
        final String result;
        if (originalStr.isEmpty()) {
        result = originalStr;
        } else {
        final String first = originalStr.substring(0, splitIndex).toLowerCase(
                locale);
        final String rest = originalStr.substring(splitIndex);
        final StringBuilder uncapStr = new StringBuilder(first).append(rest);
        result = uncapStr.toString();
        }
        return result;
    }

আপডেট: উদাহরণস্বরূপ লোকেল সেটিংটি Iতুর্কি এবং জার্মান ভাষায় ছোট হাতের করা যাক :

System.out.println(uncapitalize("I", new Locale("TR","tr")));
System.out.println(uncapitalize("I", new Locale("DE","de")));

দুটি ভিন্ন ফলাফল আউটপুট হবে:

আমি

i


7

জাভাতে স্ট্রিংগুলি পরিবর্তনযোগ্য, সুতরাং যে কোনও উপায়ে একটি নতুন স্ট্রিং তৈরি হবে।

আপনার প্রথম উদাহরণটি সম্ভবত কিছুটা দক্ষ হবে কারণ এটির জন্য কেবল একটি নতুন স্ট্রিং তৈরি করতে হবে এবং অস্থায়ী অক্ষরের অ্যারে নয়।


4
প্রকৃতপক্ষে, প্রথম উপায়টি একটি অস্থায়ী স্ট্রিং তৈরি করে (সাবস্ট্রিংয়ের জন্য), যা অক্ষরের অ্যারের চেয়ে দামি।
হট লিকস

4
ডেটা সমর্থন না করে
অসহায়

3

আপনি যা চান তা সংরক্ষণাগারভুক্ত করার জন্য একটি খুব ছোট এবং সাধারণ স্ট্যাটিক পদ্ধতি:

public static String decapitalizeString(String string) {
    return string == null || string.isEmpty() ? "" : Character.toLowerCase(string.charAt(0)) + string.substring(1);
}

2

আপনার যা প্রয়োজন তা যদি খুব সহজ হয় (যেমন জাভা শ্রেণীর নাম, কোনও লোকেল নেই), তবে গুগল পেয়ারা লাইব্রেরিতে আপনি কেসফর্ম্যাট ক্লাসটিও ব্যবহার করতে পারেন ।

String converted = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, "FooBar");
assertEquals("fooBar", converted);

অথবা আপনি একটি রূপান্তরকারী বস্তু প্রস্তুত এবং পুনরায় ব্যবহার করতে পারেন, যা আরও কার্যকর হতে পারে।

Converter<String, String> converter=
    CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL);

assertEquals("fooBar", converter.convert("FooBar"));

গুগল পেয়ারা স্ট্রিং ম্যানিপুলেশনের দর্শন আরও ভালভাবে বুঝতে, এই উইকি পৃষ্ঠাটি দেখুন



1

আমি কেবল আজই এটি জুড়ে এসেছি। নিজেকে সবচেয়ে পথচারী উপায়ে এটি করার চেষ্টা করেছি। যে এক লাইন, দীর্ঘ দীর্ঘ। এখানে যায়

String str = "TaxoRank"; 

System.out.println(" Before str = " + str); 

str = str.replaceFirst(str.substring(0,1), str.substring(0,1).toLowerCase());

System.out.println(" After str = " + str);

দেয়:

Str = ট্যাক্সরঙ্কস এর আগে

Str = ট্যাক্সরঙ্কের পরে


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