জাভাতে স্ট্রিংস প্যাড করার কোনও সহজ উপায় আছে?
এমন কিছু দেখে মনে হচ্ছে যা কিছু স্ট্রিংগিল-এর মতো এপিআইতে থাকা উচিত, তবে আমি এটি করে এমন কিছুই খুঁজে পাচ্ছি না।
জাভাতে স্ট্রিংস প্যাড করার কোনও সহজ উপায় আছে?
এমন কিছু দেখে মনে হচ্ছে যা কিছু স্ট্রিংগিল-এর মতো এপিআইতে থাকা উচিত, তবে আমি এটি করে এমন কিছুই খুঁজে পাচ্ছি না।
উত্তর:
এ্যাপাচি StringUtils
বিভিন্ন পদ্ধতি আছে: leftPad
, rightPad
, center
এবং repeat
।
তবে দয়া করে নোট করুন - যেমন অন্যরা এই উত্তরে উল্লেখ করেছেন এবং প্রদর্শন করেছেন - String.format()
এবং Formatter
জেডিকেতে ক্লাসগুলি আরও ভাল বিকল্প। কমন্স কোডের মাধ্যমে এগুলি ব্যবহার করুন।
জাভা ১.২ থেকে যেহেতু 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*
1$
জন্য? @ লিও একটি খুব অনুরূপ উত্তর দিয়েছে যা ব্যবহার করে না 1$
এবং এটি দৃশ্যত একই প্রভাব ফেলে। এটা কি কোন পার্থক্য তৈরি করছে?
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
*********
.replace(' ', '*')
বরং প্যাডিংয়ের প্রভাবটি দেখানোর উদ্দেশ্য ছিল। পাসওয়ার্ড লুকিয়ে রাখার এক্সপ্রেশনটিতে যাইহোক এই সমস্যাটি নেই ... দেশীয় জাভা বৈশিষ্ট্যটি ব্যবহার করে বাম এবং ডান প্যাডিং স্ট্রিংটি কাস্টমাইজ করার বিষয়ে আরও উত্তরের জন্য আমার অন্যান্য উত্তরটি দেখুন।
String.format("%30s", "pad left").replaceAll("(?<=( |^)) ", "*")
বাString.format("%-30s", "pad right").replaceAll(" (?=( |$))", "*")
ইন পেয়ারা , এই সহজ:
Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
কিছু সাধারণ:
মানটি একটি স্ট্রিং হওয়া উচিত। যদি তা না হয় তবে স্ট্রিংয়ে রূপান্তর করুন। লাইক "" + 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"
একবার দেখুন 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();
}
অ্যাপাচি কমন্স ছাড়াও String.format
, সরল প্যাডিংয়ের (যেমন স্পেস সহ) যত্ন নিতে সক্ষম হওয়া উচিত তাও দেখুন ।
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...
str
, তাই এটি সঠিক is
(length - str.length())
হয় 0
? বিন্যাসটি FormatFlagsConversionMismatchException
যখন %0s
বিন্যাস স্ট্রিং হয় তখন একটি ছুড়ে দেয় ।
এটি বের করতে আমার কিছুটা সময় লেগেছে। আসল কীটি সেই ফর্ম্যাটর ডকুমেন্টেশনটি পড়া।
// 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);
আমি জানি যে এই থ্রেডটি একপ্রকার পুরানো এবং মূল প্রশ্নটি একটি সহজ সমাধানের জন্য ছিল তবে যদি এটি সত্যই দ্রুত হওয়া উচিত বলে মনে করা হয় তবে আপনার একটি চর অ্যারে ব্যবহার করা উচিত।
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 + এ) ব্যবহার করা উচিত ।
ডানদিকে প্যাড করার আরও একটি উপায় এখানে:
// 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-------";
জাভা ১১, স্ট্রিং.আরপিট (ইনট) একটি প্রদত্ত স্ট্রিং বাম / ডান প্যাডে ব্যবহার করা যেতে পারে।
System.out.println("*".repeat(5)+"apple");
System.out.println("apple"+"*".repeat(5));
আউটপুট:
*****apple
apple*****
আপনি প্রতিবারের জন্য পুনর্নির্মাণের চেয়ে প্যাডিং ডেটা ধরে রেখে প্রতি কল ওভারহেড হ্রাস করতে পারবেন:
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ণের জন্য, এটি থ্রেড-নিরাপদ করুন! ;-)
জিরো সহ প্যাড:
String.format("|%020d|", 93); // prints: |00000000000000000093|
আপনি ভেরিয়েবল স্ট্রিং দৈর্ঘ্যের প্যাডিংয়ের জন্য স্ট্রিংবিল্ডার অ্যাপেন্ড () এবং সন্নিবেশ () পদ্ধতিগুলি ব্যবহার করতে পারেন:
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());
এইটা কাজ করে:
"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")
এটি আপনার স্ট্রিংএক্সএক্সএক্স 9 টি চর পর্যন্ত একটি সাদা জায়গা দিয়ে পূর্ণ করবে। এর পরে সমস্ত সাদা স্থান ০. এর সাথে প্রতিস্থাপন করা হবে আপনি হোয়াইটস্পেস এবং ০ টি যা চান পরিবর্তন করতে পারবেন ...
static
পদ্ধতিটি চাওয়া উচিত String.format(…)
। উত্স কোডে চারটি অক্ষর সংরক্ষণ করা পাঠযোগ্যতা হ্রাসের পক্ষে কার্যকর নয়।
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 "";
}
আমাকে অন্য কয়েকটি স্ট্রিংয়ের সাথে সম্মতি জানানোর আগে আপনাকে বাম / ডান প্যাডিং (বা উপসর্গ / প্রত্যয় স্ট্রিং বা স্পেসস) দেওয়ার দরকার রয়েছে এমন কয়েকটি ক্ষেত্রে একটি উত্তর ছেড়ে দিন এবং আপনি দৈর্ঘ্য বা কোনও শর্ত পরীক্ষা করতে চান না।
নির্বাচিত উত্তরের সাথে একই, আমি StringUtils
অ্যাপাচি কমন্সকে পছন্দ করব তবে এই উপায়টি ব্যবহার করে:
StringUtils.defaultString(StringUtils.leftPad(myString, 1))
ব্যাখ্যা করা:
myString
: আমি ইনপুট স্ট্রিং নাল হতে পারেStringUtils.leftPad(myString, 1)
: যদি স্ট্রিং নাল হয়, এই বিবৃতিটিও নাল ফিরে আসবেdefaultString
খালি স্ট্রিংটি ব্যবহার করে কনটেনেটেট নালটি প্রতিরোধ করুন@ কে এবং @ মারলন তারকের উত্তরগুলি কেবলমাত্র একটিই ব্যবহার করতে পারে 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
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
আরও কাজ করবে বলে মনে হচ্ছে, এটি আসলে জেভিএমকে ডিফল্ট শূন্যস্থান পূরণ করতে দেয়।
java.util.Formatter
বাম এবং ডান প্যাডিং করবে। অদ্ভুত তৃতীয় পক্ষের নির্ভরতার প্রয়োজন নেই (আপনি কি এগুলিকে তুচ্ছ কিছু হিসাবে যুক্ত করতে চান)।
[আমি বিশদটি বাদ দিয়ে এই পোস্টটিকে 'সম্প্রদায় উইকি' তৈরি করেছি কারণ এটি আমার প্রয়োজনের কিছু নয়।]
সমস্ত স্ট্রিং অপারেশন সাধারণত খুব দক্ষ হওয়া প্রয়োজন - বিশেষত যদি আপনি বড় আকারের ডেটা নিয়ে কাজ করছেন। আমি এমন কিছু চেয়েছিলাম যা দ্রুত এবং নমনীয়, আপনি যেভাবে পিএলএসকিএল প্যাড কমান্ড পাবেন তার অনুরূপ। এছাড়াও, আমি কেবল একটি ছোট জিনিসটির জন্য একটি বিশাল লিব অন্তর্ভুক্ত করতে চাই না। এই বিবেচনার সাথে এই সমাধানগুলির কোনওটিই সন্তোষজনক ছিল না। এই সমাধানগুলি আমি নিয়ে এসেছি, এর সেরা বেঞ্চ-চিহ্নিতকরণের ফলাফল ছিল, যদি কেউ এর উপর উন্নতি করতে পারে তবে দয়া করে আপনার মন্তব্য যুক্ত করুন।
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;
}
}
এই ফাংশনটি ব্যবহার করুন।
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
অনেকের কাছে কিছু আকর্ষণীয় কৌশল রয়েছে তবে আমি এটিকে সহজ রাখতে পছন্দ করি তাই আমি এগুলি দিয়ে চলেছি:
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();
}
কোনও এপিআই ছাড়াই একটি সহজ সমাধান নীচে থাকবে:
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();
}
জাভা অনেলাইনার্স, অভিনব গ্রন্থাগার নেই।
// 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"
পুনরাবৃত্তি ব্যবহার সম্পর্কে কীভাবে? নীচে দেওয়া সমাধানটি সমস্ত জেডিকে সংস্করণের সাথে সামঞ্জস্যপূর্ণ এবং কোনও বাহ্যিক লাইব্রেরির প্রয়োজন নেই :)
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);
}
}
দ্রষ্টব্য : এই দ্রবণটি প্যাডিং সংযোজন করবে, সামান্য সাম্প্রতিকতার সাথে আপনি প্যাডের মানটি উপস্থাপন করতে পারেন।
আপনারা যারা খুব দীর্ঘ স্ট্রিংস এর জন্য একটি সমান্তরাল সংস্করণ :-)
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));
পেয়ারা প্যাডিং উদাহরণ:
অ্যাপাচি কমন্সে প্যাডিংয়ের উদাহরণ:
জেডিকে উদাহরণস্বরূপ:
একটি সহজ সমাধান হবে:
package nl;
public class Padder {
public static void main(String[] args) {
String s = "123" ;
System.out.println("#"+(" " + s).substring(s.length())+"#");
}
}