আমি জাভাতে কোনও স্ট্রিং প্যাড করব কীভাবে?


431

জাভাতে স্ট্রিংস প্যাড করার কোনও সহজ উপায় আছে?

এমন কিছু দেখে মনে হচ্ছে যা কিছু স্ট্রিংগিল-এর মতো এপিআইতে থাকা উচিত, তবে আমি এটি করে এমন কিছুই খুঁজে পাচ্ছি না।


স্ট্রিং ফরম্যাটার বনাম অ্যাপাচি ফাংশন ইস্যুতে অ্যাপাচি ফাংশনটি আরও স্পষ্ট এবং পড়া সহজ বলে সন্দেহ নেই। ফাংশন নামগুলিতে ফর্ম্যাটর মোড়ানো আদর্শ নয়।
টেরা কেইনস

উত্তর:


189

এ্যাপাচি StringUtilsবিভিন্ন পদ্ধতি আছে: leftPad, rightPad, centerএবং repeat

তবে দয়া করে নোট করুন - যেমন অন্যরা এই উত্তরে উল্লেখ করেছেন এবং প্রদর্শন করেছেন - String.format()এবং Formatterজেডিকেতে ক্লাসগুলি আরও ভাল বিকল্প। কমন্স কোডের মাধ্যমে এগুলি ব্যবহার করুন।


91
java.util. Formatter (এবং স্ট্রিং. ফর্ম্যাট ()) এটি করে। জেডিকে সংস্করণটি কাজটি করে (যা এটি করে) যদি কোনও কাজ করে তবে সর্বদা বাহ্যিক লাইব্রেরিতে জেডিকে পছন্দ করুন।
ক্লিটাস

6
বিভিন্ন কারণে, আমি এখন আপাচি কমন্সে পেয়ারা পছন্দ করতাম; এই উত্তরটি পেয়ারাতে এটি কীভাবে করবেন তা দেখায়
জোনিক

1
@ জোনিক আপনি কি কিছু কারণের তালিকা বজায় রাখতে চান? এপিআই দেখতে দেখতে অনেকটা একই রকম।
glen3b

3
@ গ্লেন 3 বি: এই স্ট্রিং প্যাডিং সহায়কদের মতো একটি পৃথক ইউটিলিটির জন্য এটি কোন লিব ব্যবহার করতে পারে তা আসলেই কোনও পার্থক্য করে না। এটি বলেছিল, পেয়ারা সামগ্রিকভাবে বিভিন্ন অ্যাপাচি কমন্স প্রকল্পের (কমন্স ল্যাং, কমন্স কালেকশনস, কমন্স আইও, ইত্যাদি) তুলনায় আরও আধুনিক, ক্লিনার এবং আরও ভাল ডকুমেন্টেড লিব। এটি সত্যই স্মার্ট ছেলেরা (কেভিন বুউরিলিয়ন এট আল) দ্বারা নির্মিত, যাদের মধ্যে অনেকে এসওতে সক্রিয় রয়েছে । আমি নিজেই বহু বছর আগে ঠিক পেয়ারা দিয়ে বিভিন্ন অ্যাপাচি কমন্স লিবগুলি প্রতিস্থাপন করে শেষ করেছি এবং এর জন্য কোনও আফসোস নেই।
জোনিক

3
@ গ্লেন 3 বি: এই প্রশ্নটিতে আরও কিছু ভাল পড়া
জোনিক

634

জাভা ১.২ থেকে যেহেতু String.format()প্রদত্ত স্ট্রিং বাম / ডান প্যাডে ব্যবহৃত হতে পারে।

public static String padRight(String s, int n) {
     return String.format("%-" + n + "s", s);  
}

public static String padLeft(String s, int n) {
    return String.format("%" + n + "s", s);  
}

...

public static void main(String args[]) throws Exception {
 System.out.println(padRight("Howto", 20) + "*");
 System.out.println(padLeft("Howto", 20) + "*");
}

এবং আউটপুটটি হ'ল:

Howto               *
               Howto*

39
আপনার যদি অন্যান্য চরগুলি (ফাঁকা স্থান নয়) নিয়ে এলপ্যাডের দরকার হয় তবে কী হবে? স্ট্রিং.ফর্ম্যাট দিয়ে কি এখনও এটি সম্ভব? আমি এটা কাজ করতে সক্ষম নই ...
গাইডো

6
আফাইক স্ট্রিং.ফোর্ম্যাট () এটি করতে পারে না তবে এটি কোড করা খুব কঠিন নয়, দেখুন rgagnon.com/javadetails/java-0448.html (২ য় উদাহরণ)
RealHowTo

61
@ নুলউউআরআরএম, আপনি যদি rgagnon.com এর কথা উল্লেখ করছেন তবে সচেতন হন যে রিয়েলহটোও rgagnon.com এর লেখক, তাই তিনি নিজেই জমা দিচ্ছেন ...
কলিন পিকার্ড

3
কমপক্ষে আমার জেভিএম-তে, "#" কাজ করে না, "-" ভাল আছে। (শুধু # মুছুন)। এটি ফর্ম্যাটার ডকুমেন্টেশনের সাথে সামঞ্জস্যপূর্ণ হতে পারে, আমি জানি; এটিতে "'#' '\ u0023' বলে আউটপুটটির বিকল্প ফর্মটি ব্যবহার করা দরকার the রূপটির সংজ্ঞা রূপান্তর দ্বারা নির্দিষ্ট করা আছে।"
গাটোয়াগ্রাগো

6
দুর্দান্ত উত্তরের জন্য ধন্যবাদ। যদিও আমার সন্দেহ আছে, কিসের 1$জন্য? @ লিও একটি খুব অনুরূপ উত্তর দিয়েছে যা ব্যবহার করে না 1$এবং এটি দৃশ্যত একই প্রভাব ফেলে। এটা কি কোন পার্থক্য তৈরি করছে?
ফ্যাব্রিসিও ম্যাট

257

10 টি অক্ষরে প্যাডিং:

String.format("%10s", "foo").replace(' ', '*');
String.format("%-10s", "bar").replace(' ', '*');
String.format("%10s", "longer than 10 chars").replace(' ', '*');

আউটপুট:

  *******foo
  bar*******
  longer*than*10*chars

পাসওয়ার্ডের অক্ষরের জন্য '*' প্রদর্শন করুন:

String password = "secret123";
String padded = String.format("%"+password.length()+"s", "").replace(' ', '*');

আউটপুটটির পাসওয়ার্ড স্ট্রিংয়ের সমান দৈর্ঘ্য রয়েছে:

  secret123
  *********

50
যতক্ষণ না আমরা সকলে মনে করি স্পেস দিয়ে স্ট্রিংয়ের মধ্যে দিয়ে যাব না ...: ডি
লিভিয়াথনবাদার

4
আমি @ ওপরিউইউ ৪০০ এর সাথে আছি - লিওর দেওয়া উদাহরণ সহ স্পেস সহ স্ট্রিংগুলির জন্য এটি একটি ভয়ানক সমাধান। বামে বা ডানদিকে স্ট্রিংয়ের প্যাডিংয়ের সমাধানটি যদি ইনপুট স্ট্রিংয়ের মূল প্যাডিংয়ের কারণে নির্দিষ্ট প্যাডিং দৈর্ঘ্যের অতিক্রম না করে তবে ইনপুট স্ট্রিংটি আউটপুটে প্রদর্শিত হবে না।
ব্রায়ান ওয়ারশা

3
স্থান সমস্যা স্বীকার। .replace(' ', '*')বরং প্যাডিংয়ের প্রভাবটি দেখানোর উদ্দেশ্য ছিল। পাসওয়ার্ড লুকিয়ে রাখার এক্সপ্রেশনটিতে যাইহোক এই সমস্যাটি নেই ... দেশীয় জাভা বৈশিষ্ট্যটি ব্যবহার করে বাম এবং ডান প্যাডিং স্ট্রিংটি কাস্টমাইজ করার বিষয়ে আরও উত্তরের জন্য আমার অন্যান্য উত্তরটি দেখুন।
লিও

যদি স্ট্রিংটিতে কেবল একটি একক স্পেস থাকে এবং আপনি বিভিন্ন অক্ষর দিয়ে প্যাড করতে চান তবে আপনি পিছনে / সামনের চেহারা দিয়ে রেজেক্স রিপ্লেসটি ব্যবহার করতে পারেন: String.format("%30s", "pad left").replaceAll("(?<=( |^)) ", "*")বাString.format("%-30s", "pad right").replaceAll(" (?=( |$))", "*")
জারোসলা পাওলাক


33

কিছু সাধারণ:

মানটি একটি স্ট্রিং হওয়া উচিত। যদি তা না হয় তবে স্ট্রিংয়ে রূপান্তর করুন। লাইক "" + 123বাInteger.toString(123)

// let's assume value holds the String we want to pad
String value = "123";

মান দৈর্ঘ্যের চর সূচক থেকে প্যাডের শেষ দৈর্ঘ্য অবধি সাবস্ট্রিং শুরু:

String padded="00000000".substring(value.length()) + value;

// now padded is "00000123"

আরও সুনির্দিষ্ট

প্যাড ডান:

String padded = value + ("ABCDEFGH".substring(value.length())); 

// now padded is "123DEFGH"

প্যাড বাম:

String padString = "ABCDEFGH";
String padded = (padString.substring(0, padString.length() - value.length())) + value;

// now padded is "ABCDE123"

24

একবার দেখুন org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar)

তবে অ্যালগরিদম খুব সহজ (ডান অবধি আকারের প্যাড):

public String pad(String str, int size, char padChar)
{
  StringBuffer padded = new StringBuffer(str);
  while (padded.length() < size)
  {
    padded.append(padChar);
  }
  return padded.toString();
}

11
নোট করুন যে জাভা 1.5 হিসাবে স্ট্রিংবুফারের পরিবর্তে স্ট্রিংবুডার ব্যবহার করা মূল্যবান।
জন স্কিটি


17
public static String LPad(String str, Integer length, char car) {
  return (str + String.format("%" + length + "s", "").replace(" ", String.valueOf(car))).substring(0, length);
}

public static String RPad(String str, Integer length, char car) {
  return (String.format("%" + length + "s", "").replace(" ", String.valueOf(car)) + str).substring(str.length(), length + str.length());
}

LPad("Hi", 10, 'R') //gives "RRRRRRRRHi"
RPad("Hi", 10, 'R') //gives "HiRRRRRRRR"
RPad("Hi", 10, ' ') //gives "Hi        "
RPad("Hi", 1, ' ')  //gives "H"
//etc...

4
মনোযোগ দিন: আপনি উল্টো ফাংশন নাম; আপনি যদি এটি চালান আপনি দেখতে পাবেন।
10:52

প্লাস যদি আসল স্ট্রের ফাঁকা স্থান থাকে তবে এটি কাজ করে না
স্টিভেন শ

@ স্টিভেনশো যদি আমার ভুল না হয় তবে প্রতিস্থাপনটি আসলটিকে লক্ষ্য করে না str, তাই এটি সঠিক is
মাফু

3
কনভেনশন দ্বারা আপনার ফাংশন নামের জন্য মূলধনপত্র ব্যবহার করা উচিত নয়।
অধ্যক্ষ-আদর্শ-ডোমেন

সেখানে স্ট্রিং ফিরে যখন যেমন উপর একটি অনুপস্থিত শর্তসাপেক্ষ হয় (length - str.length())হয় 0? বিন্যাসটি FormatFlagsConversionMismatchExceptionযখন %0sবিন্যাস স্ট্রিং হয় তখন একটি ছুড়ে দেয় ।
ডেভিন ওয়াল্টারস

7

এটি বের করতে আমার কিছুটা সময় লেগেছে। আসল কীটি সেই ফর্ম্যাটর ডকুমেন্টেশনটি পড়া।

// Get your data from wherever.
final byte[] data = getData();
// Get the digest engine.
final MessageDigest md5= MessageDigest.getInstance("MD5");
// Send your data through it.
md5.update(data);
// Parse the data as a positive BigInteger.
final BigInteger digest = new BigInteger(1,md5.digest());
// Pad the digest with blanks, 32 wide.
String hex = String.format(
    // See: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
    // Format: %[argument_index$][flags][width]conversion
    // Conversion: 'x', 'X'  integral    The result is formatted as a hexadecimal integer
    "%1$32x",
    digest
);
// Replace the blank padding with 0s.
hex = hex.replace(" ","0");
System.out.println(hex);

কেন এত জটিল জটিল? আপনি স্রেফ স্ট্রিং হেক্স = স্ট্রিং.ফর্ম্যাট ("% 032x", ডাইজেস্ট) করতে পারতেন; অযথা প্রতিস্থাপন ব্যতীত (এবং) নির্দিষ্ট ভেরিয়েবলগুলি অ্যাক্সেস করার জন্য $ ব্যবহার করার পরে (ঠিক আছে, কেবল একটিই আছে)) সঠিকভাবে একই ফলাফল
পেয়েছিল

@ আর্টঅফ ওয়ারফেয়ার ফেয়ার পয়েন্ট মূলত কেউ অন্য প্রশ্নে প্যাডিং হেক্স মানগুলির জন্য জিজ্ঞাসা করেছিলেন, আমি দেখেছি যে ফর্ম্যাটর ডকুমেন্টেশনের সাথে আমার লিঙ্ক ছিল। এটি সম্পূর্ণতার জন্য জটিল।
এনটল্ক

6

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

public static String pad(String str, int size, char padChar)
{
    if (str.length() < size)
    {
        char[] temp = new char[size];
        int i = 0;

        while (i < str.length())
        {
            temp[i] = str.charAt(i);
            i++;
        }

        while (i < size)
        {
            temp[i] = padChar;
            i++;
        }

        str = new String(temp);
    }

    return str;
}

বিন্যাস সমাধানটি সর্বোত্তম নয়। কেবল বিন্যাসের স্ট্রিং তৈরি করা 2 টি নতুন স্ট্রিং তৈরি করে।

নীচে প্রতিস্থাপন করে লক্ষ্য আকারের সাথে এসবি সূচনা করে অ্যাপাচি এর সমাধানটি উন্নত করা যেতে পারে

StringBuffer padded = new StringBuffer(str); 

সঙ্গে

StringBuffer padded = new StringBuffer(pad); 
padded.append(value);

এসবি'র অভ্যন্তরীণ বাফারটিকে বাড়তে বাধা দেয়।


যদি StringBufferএকসাথে একাধিক থ্রেড দ্বারা অ্যাক্সেস করা যায় না (যা এই ক্ষেত্রে সত্য), আপনার StringBuilderসিঙ্ক্রোনাইজেশনের ওভারহেড এড়াতে একটি (জেডিকে 1.5 + এ) ব্যবহার করা উচিত ।
glen3b

5

ডানদিকে প্যাড করার আরও একটি উপায় এখানে:

// put the number of spaces, or any character you like, in your paddedString

String paddedString = "--------------------";

String myStringToBePadded = "I like donuts";

myStringToBePadded = myStringToBePadded + paddedString.substring(myStringToBePadded.length());

//result:
myStringToBePadded = "I like donuts-------";

5

জাভা ১১, স্ট্রিং.আরপিট (ইনট) একটি প্রদত্ত স্ট্রিং বাম / ডান প্যাডে ব্যবহার করা যেতে পারে।

System.out.println("*".repeat(5)+"apple");
System.out.println("apple"+"*".repeat(5));

আউটপুট:

*****apple
apple*****

1
জাভা ১১-এর সেরা উত্তর!
নাগি আটিলা

4

আপনি প্রতিবারের জন্য পুনর্নির্মাণের চেয়ে প্যাডিং ডেটা ধরে রেখে প্রতি কল ওভারহেড হ্রাস করতে পারবেন:

public class RightPadder {

    private int length;
    private String padding;

    public RightPadder(int length, String pad) {
        this.length = length;
        StringBuilder sb = new StringBuilder(pad);
        while (sb.length() < length) {
            sb.append(sb);
        }
        padding = sb.toString();
   }

    public String pad(String s) {
        return (s.length() < length ? s + padding : s).substring(0, length);
    }

}

বিকল্প হিসাবে, আপনি ফলাফলের দৈর্ঘ্যকে pad(...)পদ্ধতির পরামিতি করতে পারেন । সেক্ষেত্রে কনস্ট্রাক্টরের পরিবর্তে সেই পদ্ধতিতে লুকানো প্যাডিংয়ের সামঞ্জস্য করুন।

(ইঙ্গিত: অতিরিক্ত creditণের জন্য, এটি থ্রেড-নিরাপদ করুন! ;-)


1
এটি থ্রেড নিরাপদ, অনিরাপদ প্রকাশনার ব্যতীত (অবশ্যই আপনার ক্ষেত্রগুলি চূড়ান্ত করুন, অবশ্যই)। আমি মনে করি + এর আগে স্ট্রস্ট্রিং করে পারফরম্যান্সের উন্নতি হতে পারে যা কনক্যাট দ্বারা প্রতিস্থাপন করা উচিত (আশ্চর্যের সাথে যথেষ্ট)
টম হাটিন -


2

আপনি ভেরিয়েবল স্ট্রিং দৈর্ঘ্যের প্যাডিংয়ের জন্য স্ট্রিংবিল্ডার অ্যাপেন্ড () এবং সন্নিবেশ () পদ্ধতিগুলি ব্যবহার করতে পারেন:

AbstractStringBuilder append(CharSequence s, int start, int end) ;

উদাহরণ স্বরূপ:

private static final String  MAX_STRING = "                    "; //20 spaces

    Set<StringBuilder> set= new HashSet<StringBuilder>();
    set.add(new StringBuilder("12345678"));
    set.add(new StringBuilder("123456789"));
    set.add(new StringBuilder("1234567811"));
    set.add(new StringBuilder("12345678123"));
    set.add(new StringBuilder("1234567812234"));
    set.add(new StringBuilder("1234567812222"));
    set.add(new StringBuilder("12345678122334"));

    for(StringBuilder padMe: set)
        padMe.append(MAX_STRING, padMe.length(), MAX_STRING.length());

2

এইটা কাজ করে:

"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")

এটি আপনার স্ট্রিংএক্সএক্সএক্স 9 টি চর পর্যন্ত একটি সাদা জায়গা দিয়ে পূর্ণ করবে। এর পরে সমস্ত সাদা স্থান ০. এর সাথে প্রতিস্থাপন করা হবে আপনি হোয়াইটস্পেস এবং ০ টি যা চান পরিবর্তন করতে পারবেন ...


খালি স্ট্রিংটিকে গালি দেওয়ার পরিবর্তে আপনার staticপদ্ধতিটি চাওয়া উচিত String.format(…)। উত্স কোডে চারটি অক্ষর সংরক্ষণ করা পাঠযোগ্যতা হ্রাসের পক্ষে কার্যকর নয়।
হোলার

2
public static String padLeft(String in, int size, char padChar) {                
    if (in.length() <= size) {
        char[] temp = new char[size];
        /* Llenado Array con el padChar*/
        for(int i =0;i<size;i++){
            temp[i]= padChar;
        }
        int posIniTemp = size-in.length();
        for(int i=0;i<in.length();i++){
            temp[posIniTemp]=in.charAt(i);
            posIniTemp++;
        }            
        return new String(temp);
    }
    return "";
}

2

আমাকে অন্য কয়েকটি স্ট্রিংয়ের সাথে সম্মতি জানানোর আগে আপনাকে বাম / ডান প্যাডিং (বা উপসর্গ / প্রত্যয় স্ট্রিং বা স্পেসস) দেওয়ার দরকার রয়েছে এমন কয়েকটি ক্ষেত্রে একটি উত্তর ছেড়ে দিন এবং আপনি দৈর্ঘ্য বা কোনও শর্ত পরীক্ষা করতে চান না।

নির্বাচিত উত্তরের সাথে একই, আমি StringUtilsঅ্যাপাচি কমন্সকে পছন্দ করব তবে এই উপায়টি ব্যবহার করে:

StringUtils.defaultString(StringUtils.leftPad(myString, 1))

ব্যাখ্যা করা:

  • myString: আমি ইনপুট স্ট্রিং নাল হতে পারে
  • StringUtils.leftPad(myString, 1): যদি স্ট্রিং নাল হয়, এই বিবৃতিটিও নাল ফিরে আসবে
  • তারপরে defaultStringখালি স্ট্রিংটি ব্যবহার করে কনটেনেটেট নালটি প্রতিরোধ করুন

2

@ কে এবং @ মারলন তারকের উত্তরগুলি কেবলমাত্র একটিই ব্যবহার করতে পারে char[], যা অ্যাপ্লিকেশনগুলিতে প্রতি সেকেন্ডে প্যাডিংয়ের পদ্ধতিতে বেশ কয়েকটি কল রয়েছে এটি সর্বোত্তম পন্থা। যাইহোক, তারা কোনও অ্যারে ম্যানিপুলেশন অপ্টিমাইজেশানের সুবিধা নেয় না এবং আমার স্বাদের জন্য এটি একটু ওভাররাইট করা হয়; এটি কোনও লুপ ছাড়াই করা যায়

public static String pad(String source, char fill, int length, boolean right){
    if(source.length() > length) return source;
    char[] out = new char[length];
    if(right){
        System.arraycopy(source.toCharArray(), 0, out, 0, source.length());
        Arrays.fill(out, source.length(), length, fill);
    }else{
        int sourceOffset = length - source.length();
        System.arraycopy(source.toCharArray(), 0, out, sourceOffset, source.length());
        Arrays.fill(out, 0, sourceOffset, fill);
    }
    return new String(out);
}

সাধারণ পরীক্ষা পদ্ধতি:

public static void main(String... args){
    System.out.println("012345678901234567890123456789");
    System.out.println(pad("cats", ' ', 30, true));
    System.out.println(pad("cats", ' ', 30, false));
    System.out.println(pad("cats", ' ', 20, false));
    System.out.println(pad("cats", '$', 30, true));
    System.out.println(pad("too long for your own good, buddy", '#', 30, true));
}

আউটপুট:

012345678901234567890123456789
cats                          
                          cats
                cats
cats$$$$$$$$$$$$$$$$$$$$$$$$$$
too long for your own good, buddy 

1
আপনি ব্যবহার করতে পারেন getCharsযাক Stringসরাসরি মধ্যে এর বিষয়বস্তু কপি outঅ্যারে, পরিবর্তে কলিং source.toCharArray(), দ্বারা অনুসরণ System.arraycopy। আমি এমনকি বাস্তবায়নের সহজীকরণ বিবেচনা করব char[] out = new char[length]; Arrays.fill(out, 0, length, fill); source.getChars(0, source.length(), out, right? 0: length - source.length()); return new String(out);; এটি দেখতে fillআরও কাজ করবে বলে মনে হচ্ছে, এটি আসলে জেভিএমকে ডিফল্ট শূন্যস্থান পূরণ করতে দেয়।
হলগার

1

java.util.Formatterবাম এবং ডান প্যাডিং করবে। অদ্ভুত তৃতীয় পক্ষের নির্ভরতার প্রয়োজন নেই (আপনি কি এগুলিকে তুচ্ছ কিছু হিসাবে যুক্ত করতে চান)।

[আমি বিশদটি বাদ দিয়ে এই পোস্টটিকে 'সম্প্রদায় উইকি' তৈরি করেছি কারণ এটি আমার প্রয়োজনের কিছু নয়।]


4
আমি একমত নই যে কোনও বৃহত্তর জাভা প্রকল্পে আপনি সাধারণত স্ট্রিং ম্যানিপুলেশন এরকম অনেক কিছুই করবেন, যে ত্রুটিগুলি বৃদ্ধিযোগ্য পঠনযোগ্যতা এবং এড়ানো এপাচি কমন্স ল্যাং ব্যবহারের পক্ষে উপযুক্ত। আপনি সকলেই কিছু স্ট্রিং.সুবস্ট্রিং (কিছু স্ট্রিং.ইন্ডেক্সঅফ (স্টার্টচারার)), কিছু স্ট্রিং.লাস্ট ইন্ডেক্সঅফ (শেষচরণকারী) এর মতো কোড জানেন যা স্ট্রিং ইউটিলে সহজেই এড়ানো যায়।
বনানুইজন 20

1

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

public static char[] lpad(char[] pStringChar, int pTotalLength, char pPad) {
    if (pStringChar.length < pTotalLength) {
        char[] retChar = new char[pTotalLength];
        int padIdx = pTotalLength - pStringChar.length;
        Arrays.fill(retChar, 0, padIdx, pPad);
        System.arraycopy(pStringChar, 0, retChar, padIdx, pStringChar.length);
        return retChar;
    } else {
        return pStringChar;
    }
}
  • নোট করুন এটি String.toCharArray () দিয়ে ডাকা হয় এবং ফলাফলটি নতুন স্ট্রিং ((চর []) ফলাফল) দিয়ে স্ট্রিংয়ে রূপান্তরিত হতে পারে। এর কারণ হ'ল, যদি আপনি একাধিক ক্রিয়াকলাপ প্রয়োগ করেন তবে আপনি সেগুলি চরের সমস্ত ক্ষেত্রে করতে পারেন [] এবং পর্দার পিছনে ফর্ম্যাটগুলির মধ্যে রূপান্তর না চালিয়ে স্ট্রিং চর হিসাবে সংরক্ষণ করা হয় []] যদি এই অপারেশনগুলি নিজেই স্ট্রিং ক্লাসে অন্তর্ভুক্ত করা হত তবে এটি দ্বিগুণ দক্ষ efficient গতি এবং স্মৃতি অনুসারে হত।

এটি সত্যিই সবচেয়ে দক্ষ উপায়ে দেখায়
ডেভিড লিলজেগ্রেন

1

এই ফাংশনটি ব্যবহার করুন।

private String leftPadding(String word, int length, char ch) {
   return (length > word.length()) ? leftPadding(ch + word, length, ch) : word;
}

ব্যবহারবিধি?

leftPadding(month, 2, '0');

আউটপুট: 01 02 03 04 .. 11 12


1

অনেকের কাছে কিছু আকর্ষণীয় কৌশল রয়েছে তবে আমি এটিকে সহজ রাখতে পছন্দ করি তাই আমি এগুলি দিয়ে চলেছি:

public static String padRight(String s, int n, char padding){
    StringBuilder builder = new StringBuilder(s.length() + n);
    builder.append(s);
    for(int i = 0; i < n; i++){
        builder.append(padding);
    }
    return builder.toString();
}

public static String padLeft(String s, int n,  char padding) {
    StringBuilder builder = new StringBuilder(s.length() + n);
    for(int i = 0; i < n; i++){
        builder.append(Character.toString(padding));
    }
    return builder.append(s).toString();
}

public static String pad(String s, int n, char padding){
    StringBuilder pad = new StringBuilder(s.length() + n * 2);
    StringBuilder value = new StringBuilder(n);
    for(int i = 0; i < n; i++){
        pad.append(padding);
    }
    return value.append(pad).append(s).append(pad).toString();
}

2
এটি খুব অদক্ষ, আপনার স্ট্রিংবিল্ডার ব্যবহার করা উচিত
wkarl

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

অ্যারিলটি আকর্ষণীয় যে আপনি উল্লেখ করেছেন কারণ আমি আজ অন্য কারও সাথে কথা বলছিলাম ol
এলেফেইস

0

কোনও এপিআই ছাড়াই একটি সহজ সমাধান নীচে থাকবে:

public String pad(String num, int len){
    if(len-num.length() <=0) return num;
    StringBuffer sb = new StringBuffer();
    for(i=0; i<(len-num.length()); i++){
        sb.append("0");
    }
    sb.append(num);
    return sb.toString();
}

0

জাভা অনেলাইনার্স, অভিনব গ্রন্থাগার নেই।

// 6 characters padding example
String pad = "******";
// testcases for 0, 4, 8 characters
String input = "" | "abcd" | "abcdefgh"

প্যাড বাম, সীমাবদ্ধ না

result = pad.substring(Math.min(input.length(),pad.length())) + input;
results: "******" | "**abcd" | "abcdefgh"

প্যাড রাইট, সীমাবদ্ধ না

result = input + pad.substring(Math.min(input.length(),pad.length()));
results: "******" | "abcd**" | "abcdefgh"

প্যাড বাম, প্যাড দৈর্ঘ্যের সীমা

result = (pad + input).substring(input.length(), input.length() + pad.length());
results: "******" | "**abcd" | "cdefgh"

প্যাড ডান, প্যাড দৈর্ঘ্যের সীমা

result = (input + pad).substring(0, pad.length());
results: "******" | "abcd**" | "abcdef"

0

পুনরাবৃত্তি ব্যবহার সম্পর্কে কীভাবে? নীচে দেওয়া সমাধানটি সমস্ত জেডিকে সংস্করণের সাথে সামঞ্জস্যপূর্ণ এবং কোনও বাহ্যিক লাইব্রেরির প্রয়োজন নেই :)

private static String addPadding(final String str, final int desiredLength, final String padBy) {
        String result = str;
        if (str.length() >= desiredLength) {
            return result;
        } else {
            result += padBy;
            return addPadding(result, desiredLength, padBy);
        }
    }

দ্রষ্টব্য : এই দ্রবণটি প্যাডিং সংযোজন করবে, সামান্য সাম্প্রতিকতার সাথে আপনি প্যাডের মানটি উপস্থাপন করতে পারেন।


0

আপনারা যারা খুব দীর্ঘ স্ট্রিংস এর জন্য একটি সমান্তরাল সংস্করণ :-)

int width = 100;
String s = "129018";

CharSequence padded = IntStream.range(0,width)
            .parallel()
            .map(i->i-(width-s.length()))
            .map(i->i<0 ? '0' :s.charAt(i))
            .collect(StringBuilder::new, (sb,c)-> sb.append((char)c), (sb1,sb2)->sb1.append(sb2));

0


-1

এটা কেমন

স্ট্রিং "হ্যালো" এবং প্রয়োজনীয় প্যাডিং "0" বাম প্যাড সহ 15

String ax="Hello";
while(ax.length() < 15) ax="0"+ax;

10
এটি এক পর্যন্ত 15 টি নতুন স্ট্রিং উত্পন্ন করে।
ক্লজ

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