क्या जावा में स्ट्रिंग्स को पैड करने का कुछ आसान तरीका है?
कुछ ऐसा लगता है जो कुछ स्ट्रिंग-यूटील जैसे एपीआई में होना चाहिए, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जो ऐसा करता है।
क्या जावा में स्ट्रिंग्स को पैड करने का कुछ आसान तरीका है?
कुछ ऐसा लगता है जो कुछ स्ट्रिंग-यूटील जैसे एपीआई में होना चाहिए, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जो ऐसा करता है।
जवाबों:
अपाचे StringUtils
कई तरीके होते हैं: leftPad
, rightPad
, center
और repeat
।
लेकिन कृपया ध्यान दें कि - जैसा कि दूसरों ने इस उत्तर में उल्लेख किया है और प्रदर्शित किया है - String.format()
और Formatter
जेडीके में कक्षाएं बेहतर विकल्प हैं। कॉमन्स कोड पर उनका उपयोग करें।
जावा 1.5 के बाद से, 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(" (?=( |$))", "*")
कुछ सरल:
मान एक स्ट्रिंग होना चाहिए। इसे स्ट्रिंग में बदलें, यदि यह नहीं है। की तरह "" + 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();
}
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
, इसलिए यह सही है।
(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);
sb के आंतरिक बफर को बढ़ने से रोक देगा।
StringBuffer
कई थ्रेड्स द्वारा एक्सेस नहीं किया जा सकता है (जो इस मामले में सच है), तो आपको StringBuilder
सिंक्रनाइज़ेशन के ओवरहेड से बचने के लिए (JDK1.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-------";
जावा 11 के बाद से, String.repeat (int) का उपयोग बाएं / दाएं पैड को दिए गए स्ट्रिंग में किया जा सकता है।
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(...)
विधि के लिए एक पैरामीटर बना सकते हैं । उस स्थिति में कंस्ट्रक्टर के बजाय उस विधि में छिपे हुए पैडिंग का समायोजन करें।
(संकेत: अतिरिक्त क्रेडिट के लिए, इसे थ्रेड-सेफ़ करें! ;-)
शून्य के साथ पैड:
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")
यह आपके स्ट्रिंग XXX को व्हॉट्सएप के साथ 9 चार्ट तक भर देगा। उसके बाद सभी व्हाट्सएप को 0. के साथ बदल दिया जाएगा। आप व्हॉट्सएप और 0 को जो चाहें बदल सकते हैं ...
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
: स्ट्रिंग I इनपुट, शून्य हो सकता हैStringUtils.leftPad(myString, 1)
: यदि स्ट्रिंग अशक्त है, तो यह कथन भी अशक्त होगाdefaultString
समतल नल को रोकने के लिए खाली स्ट्रिंग देने के लिए उपयोग करें@ck और @Marlon तारक के उत्तर केवल एक का उपयोग करने के लिए हैं 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
बाएं और दाएं पैडिंग करेंगे। विषम तृतीय पक्ष निर्भरता के लिए कोई ज़रूरत नहीं है (क्या आप उन्हें इतना तुच्छ के लिए जोड़ना चाहते हैं)।
[मैंने विवरण छोड़ दिया है और इस पोस्ट को 'कम्युनिटी विकी' बना दिया है क्योंकि यह ऐसा कुछ नहीं है जिसकी मुझे कोई आवश्यकता है।]
सभी स्ट्रिंग ऑपरेशन को आमतौर पर बहुत कुशल होने की आवश्यकता होती है - खासकर यदि आप डेटा के बड़े सेट के साथ काम कर रहे हैं। मैं कुछ ऐसा चाहता था जो तेज़ और लचीला हो, जैसा कि आपको plsql पैड कमांड में मिलेगा। इसके अलावा, मैं सिर्फ एक छोटी सी बात के लिए एक बहुत बड़ा दायित्व शामिल नहीं करना चाहता। इन विचारों के साथ इनमें से कोई भी समाधान संतोषजनक नहीं था। यह वह समाधान है जो मैं लेकर आया था, जिसमें सबसे अच्छा बेंच-मार्किंग परिणाम था, अगर कोई भी इस पर सुधार कर सकता है, तो कृपया अपनी टिप्पणी जोड़ें।
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"
पुनरावर्तन का उपयोग कैसे करें? नीचे दिए गए समाधान सभी JDK संस्करणों के साथ संगत है और कोई बाहरी पुस्तकालयों की आवश्यकता नहीं है :)
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));
गुवा में पैडिंग उदाहरण:
अपाचे कॉमन्स में पैडिंग उदाहरण:
JDK में पैडिंग उदाहरण:
एक सरल समाधान होगा:
package nl;
public class Padder {
public static void main(String[] args) {
String s = "123" ;
System.out.println("#"+(" " + s).substring(s.length())+"#");
}
}