Java - Değişkenleri dizelere dahil etmek?


114

Tamam, o halde hepimiz şunu yaparak değişkenleri dizelere dahil edebileceğinizi bilmeliyiz:

String string = "A string " + aVariable;

Bunu şöyle yapmanın bir yolu var mı:

String string = "A string {aVariable}";

Başka bir deyişle: Tırnak işaretlerini kapatmadan ve artı işaretleri eklemeden. Çok itici.


10
@Chandra Lütfen nedenini sormayın, mümkünse açıklayın. Ben de böyle yapmayı tercih ederim. Teşekkürler.
Grey Adams

3
Groovy'yi kullanın, böylece "A string $ {aVariable}" istediğiniz her şeyi yapabilirsiniz.
Kaleb Brasee

2
Bu soruda tartışılan benzer şeyler için çok çeşitli teknikler var , ancak String.format()dilde yerleşik.
ig0774

@KalebBrasee Kulağa mükemmel geliyor, ancak konu dilleri değiştirmek olduğunda her zaman tereddüt ediyorum. Kendimi geri dönmek istemiyorum.
Grey Adams

1
@GrayAdams Groovy sizi geri bırakmaz, özgürleştirir! : D
Kaleb Brasee

Yanıtlar:


124

Her zaman String.format (....) kullanabilirsiniz. yani

String string = String.format("A String %s %2d", aStringVar, anIntVar);

Bunun senin için yeterince çekici olup olmadığından emin değilim, ama oldukça kullanışlı olabilir. Sözdizimi, printf ve java.util.Formatter ile aynıdır. Özellikle tablo şeklinde sayısal verileri göstermek istersem bunu çok kullandım.


2
Bunun bir fikir meselesi olduğunu biliyorum, ancak formatbasit bir String birleştirme ifadesinden daha çekici olduğunu görmüyorum . Nerede formatEğer vesaire dolgu, sayı biçimlendirme, yapmanız gerektiğinde kendi içine almaktadır gelir.
Stephen C

1
@StephenC: Sana hiç katılmıyorum. Ancak, özellikle sizin söylediğiniz gibi ve yukarıda söylediğim gibi doldurma yapmanız gerektiğinde (yani, tablo şeklinde sayısal verileri göstermek için) String formatlama için kullanışlı bir alternatiftir. Kan kimyası ve CBC sonuç raporlarını biçimlendirmek için epeyce kullandım.
Hovercraft Full Of Eels

@StephenC Formatı birkaç nedenden dolayı seviyorum: her şeyden önce, '% d' platform satır sınırlayıcısını kullanıyor. İkincisi, tüm değişkenleri sonunda kolayca bulabilirsiniz. Girdiğiniz değişkenleri kolayca yeniden biçimlendirebilir ve hatta yeniden sıralayabilirsiniz. Hatalardan kaçınmak (gibi 1 + "oops"), özellikle FindBugs kullanıyorsanız (biçim dizelerini ve giriş parametrelerini ayrıştıran) daha kolaydır . Ve soruyu soranın dediği gibi, çoğu durumda daha okunabilir. Elbette, formatyöntemin durağan hale getirilmesi utanç verici , bu oldukça aptalca bir tasarım hatasıydı.
Maarten Bodewes

@owlstead - "Tabii ki, format yönteminin durağan hale getirilmesi utanç verici, bu oldukça aptalca bir tasarım hatasıydı." . Ha? formatHedef dizeyle nasıl ilişkilendirilir? Elbette yazmamızı beklememizi önermiyorsunuz "A String %s %2d".format(aStringVar, anIntVar)... değil mi?
Stephen C

1
@owlstead - "asFormat" doğru olmaz. Yöntemin bir format nesnesi yarattığını ve geri döndürdüğünü ima eder.
Stephen C

70

Buna dize enterpolasyonu denir; Java'da olduğu gibi yoktur.

Bir yaklaşım String.format kullanmaktır:

String string = String.format("A string %s", aVariable);

Başka bir yaklaşım, Velocity veya FreeMarker gibi bir şablon oluşturma kitaplığı kullanmaktır .


38

Ayrıca java.text.MessageFormat, sayısal bağımsız değişken dizinlerine sahip ilgili bir sözdizimi kullanan dikkate alın . Örneğin,

String aVariable = "of ponies";
String string = MessageFormat.format("A string {0}.", aVariable);

stringaşağıdakileri içeren sonuç verir :

A string of ponies.

Daha yaygın olarak, sınıf, sayısal ve zamansal biçimlendirmesi için kullanılır. JFreeChartEtiket biçimlendirmesinin bir örneği burada açıklanmaktadır ; sınıf, RCInfobir oyunun durum bölmesini biçimlendirir.


1
CSharp'tan gelen biri için bu yol daha basittir çünkü string'e benzerdir. C # 'da Biçimlendir.
Mojtaba

0

dizelerdeki değişkenleri dahil etmek için Dize biçimini kullanabilirsiniz

dizeye 2 değişken eklemek için bu kodu kullanıyorum:

String myString = String.format ("bu benim dizem% s% 2d", değişken1Adı, değişken2Adı);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.