JavaRush /Java blogi /Random-UZ /String sinfi
articles
Daraja

String sinfi

Guruhda nashr etilgan
  • Usullari
  • Tasodifiy qatorni yaratish
  • String taqqoslash: equals()yoki ==?
Sinf Stringjuda tez-tez dasturchilar tomonidan qo'llaniladi, shuning uchun uni juda yaxshi o'rganish kerak. Sinf satri - 1Esda tutingki, sinf ob'ektlari Stringo'zgarmasdir. Shunday qilib, siz satrni o'zgartirmoqda deb o'ylasangiz, aslida yangi satr yaratasiz. Java-da maxsus sinflar mavjud StringBufferva StringBuilderular qatorni o'zgartirishga imkon beradi. String, StringBuffer, sinflari java.langStringBuilder paketida belgilangan va import deklaratsiyasisiz avtomatik ravishda mavjud. Barcha uchta sinf interfeysni amalga oshiradi . String yaratish juda oddiy. Masalan, siz buni qilishingiz mumkin: CharSequence
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
Siz qatorlar qatorini yaratishingiz mumkin:
String[] cats = {"Васька", "Barsik", "Murzik"};
Siz bo'sh sinf ob'ektini yaratishingiz mumkin String:
String str = new String();
Belgilar qatori orqali satr yaratishingiz mumkin:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
Belgilar massivining diapazonini belgilash imkonini beruvchi konstruktor ham mavjud. Siz diapazonning boshlanishini va foydalanish uchun belgilar sonini belgilashingiz kerak:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
Siz quyidagi konstruktorlar yordamida Stringsinflar ob'ektidan sinf ob'ektini yaratishingiz mumkin :StringBufferStringBuilder
String(StringBuffer an object_StrBuf)
String(StringBuilder an object_StrBuild)

Operatorlar +va += uchunString

Java tilida plyus belgisi ( +) satrlarni birlashtirishni, boshqacha aytganda, satrlarni birlashtirishni bildiradi.
String cat = "Кот";
String name = "Васька";
//складываем две строки и пробел между ними, чтобы слова не слиплись
String fullname = cat + " " + name; // получится Кот Васька
Agar ifodadagi operandlardan birida satr bo'lsa, boshqa operandlar ham satr bo'lishi kerak. Shuning uchun, Java o'zi o'zgaruvchilarni satr bo'lmasa ham, satr tasviriga yuborishi mumkin.
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws; // хотя мы складываем число и строку, но все равно получим строку
За кулисами Java за нас преобразовало число 4 в строку "4"

Satrlarni formatlash

Faraz qilaylik, bizda string resurs bor:
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
Ushbu qatorni elementda dasturiy ravishda ko'rsatish uchun TextViewsiz koddan foydalanishingiz mumkin:
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
Tasavvur qiling-a, sizda bir nechta mushuk bor. Siz, albatta, har bir mushuk uchun o'z chizig'iga ega bo'lishingiz mumkin. Lekin chiziqlar juda o'xshash, faqat ismlar va yosh o'zgaradi. Bundan tashqari, panjalar va quyruqlar sonini o'zgartirishingiz mumkin (nima chekasiz?). Bunday hollarda siz string formatlashni qo'llashingiz mumkin. Biz o'zgartiradigan so'zlarni aniqlab olishimiz va ularni foiz belgisi bilan boshlanadigan, so'ngra bittaga ko'payadigan raqam, keyin $ssatrlar yoki $draqamlar uchun maxsus belgilar to'plami bilan almashtirishimiz kerak. Shunday qilib, keling, string resursimizni quyidagicha o'zgartiramiz:
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
Keling, kodga o'zgartirish kiritamiz:
String strBarsik = "Barsik";
String strPaws = "четыре";
String strTail = "one";
int year = 5;
String strCats = getResources().getString(R.string.aboutcat);
String strFinal = String.format(strCats, strBarsik, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Agar sizda mushuk Vaska bo'lsa va u olti yoshda bo'lsa, unda ikkita o'zgaruvchini qo'shing va chiziqni formatlang
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Bu erda oddiy formatlash misoli. Uni eslab qoling va to'g'ri joylarda foydalaning.

String manbai

Satrlarni resurslarda saqlash tavsiya etiladi. String manbasiga dasturiy ravishda kirish quyidagicha amalga oshiriladi:
String catName = getResources().getString(R.string.barsik);

Resurslardagi qator massivlaridan satrlarni ajratib oling

Aytaylik, sizda strings.xml faylida belgilangan qator qatori bor cats_array. Keyin quyidagi manbalardan qatorlarga kirishingiz mumkin:
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);

Usullari

public char charAt (int index) Ushbu satrda belgilangan ofsetdagi belgini qaytaradi. Ortga hisoblash 0 dan boshlanadi. Salbiy va mavjud bo'lmagan qiymatlarni ishlatishning hojati yo'q, jiddiyroq bo'ling. Bir nechta belgilarni ajratib olish uchun foydalaning getChars().
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar)); // выводит третий символ - т
public int codePointAt(int index) Berilgan indeksdagi Unicode belgisini qaytaradi
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointBefore(int index) Berilgan indeksdan oldingi Unicode belgisini qaytaradi
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointCount(int start, int end)startva pozitsiyalari orasidagi Unicode belgilar sonini hisoblaydiend
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
public int compareTo(String string) Belgilangan satrni Unicode belgilar qiymatlari yordamida taqqoslaydi va qaysi qator keyingisidan kichik, teng yoki katta ekanligini hisoblaydi. Saralash uchun ishlatilishi mumkin. Vaziyat hisobga olinadi. Agar satrlar mos keladigan bo'lsa, u holda 0 qaytariladi, agar noldan kichik bo'lsa, unda chaqiruvchi satr string dan kichik bo'lsa string, noldan katta bo'lsa, chaqiruvchi satr string dan katta bo'ladi string. Katta harfli so'zlar kichik harflar ustiga qo'yiladi.
String testString = "Котёнок";

if (testString.compareTo("котёнок") == 0) {
    tvInfo.setText("Строки равны");
} else {
    tvInfo.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок")); // возвращает -32
}
Satrlar massivini pufakchali tartiblash yordamida tartiblaymiz.
String[] poem = { "Мы", "везём", "с", "собой", "кота" };

for (int j = 0; j < poem.length; j++) {
	for (int i = j + 1; i < poem.length; i++) {
		if (poem[i].compareTo(poem[j]) < 0) {
			String temp = poem[j];
			poem[j] = poem[i];
			poem[i] = temp;
		}
	}
	System.out.println(poem[j]);
}
Natijada biz quyidagilarni olamiz:
Мы
везём
кота
с
собой
Ko'rib turganingizdek, atamalarning joylarini o'zgartirish mushuklarning saralash yig'indisini o'zgartirmaydi . public int compareToIgnoreCase (String string) Belgilangan qatorni katta-kichik harflarga sezgir bo'lmagan Unicode belgilar qiymatlari yordamida taqqoslaydi.
String testString = "Котёнок";

if (testString.compareToIgnoreCase("котёнок") == 0) {
    tv.setText("Строки равны"); // слова одинаковы, если не учитывать регистр
} else {
    tv.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок"));
}
public String concat (String string) Belgilangan satr bilan qatorni birlashtiradi. Ikki qatorni birlashtirishni o'z ichiga olgan yangi satr qaytariladi. E'tibor bering, usul nomining o'zida mushuk mavjud!
String testString = "Сук";
String newString = testString.concat("кот");
tv.setText(newString);
Usul operator bilan bir xil funktsiyani bajaradi +va yozilishi mumkin Сук + кот. Ammo haqiqiy mushuk odam "mushuk" usulidan foydalanadi. public boolean contains (CharSequence cs) Satrda belgilar ketma-ketligi mavjudligini aniqlaydiCharSequence
String testString = "котёнок";

if(testString.contains("кот")){
    infoTextView.setText("В слове котёнок содержится слово кот!");
}
public static String copyValueOf (char[] data, int start, int length)Uzunlik uzunligiData pozitsiyasidan start(nolga asoslangan raqamlash) boshlanadigan massivdan belgilangan belgilarni o'z ichiga olgan yangi qatorni yaratadi . Belgilangan massivdagi belgilarni o'z ichiga olgan yangi satr yaratadi. Qator yaratilgandan keyin massivni o'zgartirish yaratilgan qatorni o'zgartirmaydi. Satr bilan tugashini tekshiradi . public static String copyValueOf(char[] data)public boolean endsWith(String suffix)suffix
String str1 = "Суккот";

if(str1.endsWith("кот"))
    infoTextView.setText("Слово заканчивается на котике");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean equals (Object string) Belgilangan ob'ektni va satrni taqqoslaydi va taqqoslangan satrlar teng bo'lsa, true qiymatini qaytaradi, ya'ni. bir xil belgilarni o'z ichiga oladi va bir xil katta-kichik tartibda.
String str1 = "Кот";
String str2 = "Кошка";

if(str1.equals(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
==Usulni ikkita ob'ekt havolasini solishtiradigan va ular bir xil misolga havola qilinganligini aniqlaydigan operator bilan aralashtirib yubormaslik kerak . String solishtirishga qarang: equals()yoki ==? public boolean equalsIgnoreCase(String string) Belgilangan satrni manba satr bilan katta-kichik harflarni sezmaydigan tarzda solishtiradi va agar ular teng bo'lsa, true qiymatini qaytaradi . AZ diapazoni az diapazoniga teng deb hisoblanadi.
String str1 = "Кот";
String str2 = "кот";

if(str1.equalsIgnoreCase(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
Taqdim etilgan format va berilgan doirada mahalliylashtirilgan argumentlar yordamida formatlangan qatorni qaytaradi. Masalan, sana yoki vaqt
// выводим число типа float с двумя знаками после запятой
String.format("%.2f", floatValue);
Yangi satrda paydo bo'lgan ikkita so'zni yopishtiramiz. Bunday holda, ikkinchi so'z katta harf bilan ko'rsatiladi.
String str1 = "Кот";
String str2 = "васька";
String strResult = String.format("%s\n%S", str1, str2);
// выводим результат в TextView
infoTextView.setText(strResult);
Sonni sakkizlik sistemaga aylantiring.
String str1 = "8";
int inInt = Integer.parseInt(str1); // конвертируем строку в число
String strResult = String.format("(Восьмеричное meaning): %o\n", inInt);

infoTextView.setText(strResult);
Analogiya bo'yicha, biz o'n oltilik tizimda ko'rsatamiz
String str1 = "255";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Шестнадцатеричное meaning): %x\n", inInt);
// число 255 будет выведено How ff
infoTextView.setText(strResult);
Katta harf foydalanish uchun %X, keyin ffbo'ladi FF. O'nlik tizimdan foydalanish uchun %d. Sana turli yo'llar bilan ham ko'rsatilishi mumkin.
Date now = new Date();
Locale locale = Locale.getDefault();
infoTextView.setText(
		String.format(locale, "%tD\n", now) + // (MM/DD/YY)
		String.format(locale, "%tF\n", now) + // (YYYY-MM-DD)
		String.format(locale, "%tr\n", now) + // Full 12-hour time
		String.format(locale, "%tz\n", now) + // Time zone GMT offset
		String.format(locale, "%tZ\n", now)); // Localized time zone bbreviation
public byte[] getBytes(String charsetName) Taqdim etilgan format yordamida formatlangan qatorni qaytaradi. public void getBytes(int start, int end, byte[] data, int index)va boshqa ortiqcha yuklamalar Usul belgilarni bayt massivida saqlaydi, getChars(). Ko'pincha boshqa Unicode belgilaridan foydalanadigan turli manbalardan satrlarni eksport qilishda foydalaniladi. Masalan, Java sukut bo'yicha 16 bitli Unicode belgilar bilan ishlaydi va Internetda satrlar ko'pincha 8 bitli Unicode, ASCII va hokazolardan foydalanadi. public void getChars(int start, int end, char[] buffer, int index) Satrdan bir nechta belgilarni ajratib olish usuli. Siz pastki satr boshi indeksini ( start), ajratib olinadigan pastki satr oxiridan keyingi belgi indeksini ( end ) belgilashingiz kerak. Tanlangan belgilarni qabul qiluvchi massiv bufer parametrida joylashgan . Massivdagi indeks, undan boshlab pastki qator yoziladi, indeks parametrida uzatiladi . Massiv belgilangan pastki qatordagi barcha belgilarni o'z ichiga olishi uchun etarlicha katta ekanligiga ishonch hosil qiling.
String unusualCat = "Котёнок по имени Гав";
int start = 5;
int end = 12;
char[] buf = new char[end - start];
unusualCat.getChars(start, end, buf, 0);
infoTextView.setText(new String(buf));
public int hashCode() Ushbu ob'ekt uchun xesh-kod bo'lgan butun sonni qaytaradi. public int indexOf(int c) Belgilangan indeks bilan birinchi duch kelgan pozitsiyaning sonini qaytaradi c.
String testString = "котёнок";
// символ ё встречается в четвёртой позиции (index = 3)
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start) Pozitsiyadan boshlab indeksni qidiradistart
String testString = "котёнок";
// вернёт -1, так How после 5 символа буквы ё нет
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string) Belgilar qatorini qidiradisubString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start)subStringPozitsiyadan boshlanadigan belgilar qatorini qidiradistart
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка", 2)));
public String intern () Satrni "xeshlar" satr public boolean isEmpty () bo'sh yoki yo'qligini tekshiradi
if(catname.isEmpty()) {
    // здесь ваш code
}
Ushbu usul API 9 da (Android 2.1) paydo bo'ldi. Eski qurilmalar uchun foydalaning String.length() == 0 public int lastIndexOf (String string) и другие перегруженные версии Belgilangan indeksdagi oxirgi duch kelgan joyning raqamini qaytaradi. Masalan, siz fayl nomini kengaytmasiz olishingiz mumkin:
filename.toString().substring(0, filename.getString().lastIndexOf("."));
Ushbu misolda biz oxirgi nuqtaning o'rnini olamiz va undan oldingi pastki qatorni olamiz. public int length() Satr uzunligini qaytaradi
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length())); // возвращает 7 (семь символов)
public boolean matches(String regularExpression) Satrning oddiy iboralarga mos kelishini tekshiradi.
public int offsetByCodePoints (int index, int codePointOffset)
codePointOffsetParametr tomonidan belgilangan boshlang'ich pozitsiyasidan keyin masofada joylashgan pozitsiyani qaytaradi.Usul index public boolean regionMatches (int thisStart, String string, int start, int length) satrning belgilangan qismini satrning boshqa qismi bilan taqqoslaydi. Sinfning chaqiruvchi ob'ektining qatorlar oralig'i boshi indeksini ko'rsatishingiz kerak String. Taqqoslanadigan satr parametrda uzatiladi string. Taqqoslash amalga oshirilishi kerak bo'lgan belgining indeksi parametrga o'tkaziladi startva taqqoslanadigan pastki qator uzunligi parametrga o'tkaziladi length. public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length) Haddan tashqari yuklangan versiya. Usul katta-kichik harflarga e'tibor bermasdan, satrning belgilangan qismini satrning boshqa qismi bilan taqqoslaydi. public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии Belgini yoki belgilar ketma-ketligini targeto'zgartiradireplacement
String testString = "whale";
// меняем и на о
infoTextView.setText(testString.replace("And", "о")); // возвращается кот
public String replaceAll (String regularExpression, String replacement) public String replaceFirst (String regularExpression, String replacement) Muntazam ifoda yordamida birinchi belgilarni olib tashlaydi. Misol uchun, agar siz 001, 007, 000024 raqamlarining boshida nollarni olib tashlashingiz kerak bo'lsa, unda siz ushbu qo'ng'iroqdan foydalanishingiz mumkin.
String s = "001234-cat";
String s = s.replaceFirst ("^0*", ""); // останется 1234-cat
public String[] split (String regularExpression) и другие перегруженные версии Satrni so‘zlar massiviga ajratadi. Masalan, Vaska Ryzhik Murzik Barsik qatori mavjud va biz mushuk nomlari qatorini olishni xohlaymiz:
String catnames = "Васька Рыжик Мурзик Барсик";
String aCats[] = catnames.split(" ");  // по пробелу
Biz olamiz:
aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик
public boolean startsWith(String prefix)prefixSatr satr boshidan boshlab belgilar bilan boshlanishini tekshiradi
String str1 = "котлета";

if(str1.startsWith("кот"))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean startsWith(String prefix, int start) Berilgan satr prefixbelgilangan pozitsiyada belgilar bilan boshlanishini tekshiradi.
String str1 = "Суккот";

if(str1.startsWith("кот", 3))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public CharSequence subSequence (int start, int end) Usulga o'xshash substring(), lekin foydalanish mumkin CharSequence. public String substring(int start)va boshqa ortiqcha yuklar Berilgan satrdan pozitsiyadan boshlab startsatr oxirigacha/pozitsiyadagi belgi bilan tugaydigan belgilar bilan yangi ketma-ketlik/satr yaratadi end. Yangi qatorda startoxirigacha belgilar mavjud - 1, shuning uchun biz yana bitta belgi olamiz.
String testString = "скотина";

infoTextView.setText(testString.substring(1, 4)); // возвращается кот
public char[] toCharArray() Ushbu satrdagi belgilarni belgilar qatoriga ko'chiradi. Xuddi shu natijani orqali olish mumkin getChars(). Hujjatlar ushbu usuldan foydalanishni tavsiya etmaydi, charAt().
String unusualCat = "Котёнок по имени Гав";

char[] yomoe = unusualCat.toCharArray();
infoTextView.setText(String.valueOf(yomoe[3]));
public String toLowerCase() и другие перегруженные версии Satrni kichik harfga aylantiradi. Standart til konvertatsiyani boshqaradi. String cat = "Mushuk"; Pastki qator = cat.toLowerCase(); infoTextView.setText(pastki); public String toString () Satrni qaytaradi. O'zi allaqachon tor bo'lgan ipning o'zi uchun ipni qaytarish ma'nosiz (oh, men uni qanday egdim). Ammo bu usul aslida boshqa sinflar uchun juda foydali. public String toUpperCase() Satrni katta harfga aylantiradi. Standart til konvertatsiyani boshqaradi.
String cat = "Кот";
String upper = cat.toUpperCase();
infoTextView.setText(upper);
public String trim() Satrning boshida va oxiridagi bo'shliqlarni olib tashlaydi.
String str = "   Hello Kitty  ".trim();
infoTextView.setText(str);
public static String valueOf(long value)va boshqa ortiqcha yuklar Tarkibni (raqamlar, ob'ektlar, belgilar, belgilar massivlari) satrga o'zgartiradi.
int catAge = 7; // это число

infoTextView.setText(String.valueOf(catAge)); // преобразовано в строку

Tasodifiy qatorni yaratish

Aytaylik, bizga berilgan belgilarning tasodifiy qatori kerak.
private static final String mCHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
private static final int STR_LENGTH = 9; // длина генерируемой строки
Random random = new Random();

public void onClick(View view) {
    TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
    infoTextView.setText(createRandomString());
}

public String createRandomString() {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < STR_LENGTH; i++) {
        int number = random.nextInt(mCHAR.length());
        char ch = mCHAR.charAt(number);
        builder.append(ch);
    }
    return builder.toString();
}

String taqqoslash: equals()yoki ==?

Keling, bir misolni ko'rib chiqaylik.
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;

infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
Ikkala o'zgaruvchida bir xil so'z bo'lsa-da, biz ikki xil ob'ekt bilan ishlaymiz va operator false ni== qaytaradi . Bir marta, daraxtlar katta bo'lganida, men turli manbalardan ikkita ipni solishtirishim kerak edi. Satrlar bir xil ko'rinsa-da, operator yordamida taqqoslash noto'g'ri chiqdi va men uchun barcha kartalarni chalkashtirib yubordi. Va shundan keyingina men foydalanishim kerakligini bilib oldim . Java tilidagi satr alohida ob'ekt bo'lib, u boshqa ob'ekt bilan bir xil bo'lmasligi mumkin, ammo satrning chiqishi ekranda bir xil ko'rinishi mumkin. Shunchaki Java, mantiqiy operator (shuningdek ) misolida, ob'ektlarga havolalarni solishtiradi (ibtidoiylar bilan ishlashda bunday muammo yo'q): ==equals()==!=
String s1 = "hello";
String s2 = "hello";
String s3 = s1;
String s4 = "h" + "e" + "l" + "l" + "o";
String s5 = new String("hello");
String s6 = new String(new char[]{'h', 'e', 'l', 'l', 'o'});

infoTextView.setText(s1 + " == " + s2 + ": " + (s1 == s2));
// попробуйте и другие варианты
// infoTextView.setText(s1 + " equals " + s2 + ": " + (s1.equals(s2)));
// infoTextView.setText(s1 + " == " + s3 + ": " + (s1 == s3));
// infoTextView.setText(s1 + " equals " + s3 + ": " + (s1.equals(s3)));
// infoTextView.setText(s1 + " == " + s4 + ": " + (s1 == s4));
// infoTextView.setText(s1 + " equals " + s4 + ": " + (s1.equals(s4)));
// infoTextView.setText(s1 + " == " + s5 + ": " + (s1 == s5)); // false
// infoTextView.setText(s1 + " equals " + s5 + ": " + (s1.equals(s5)));
// infoTextView.setText(s1 + " == " + s6 + ": " + (s1 == s6)); // false
// infoTextView.setText(s1 + " equals " + s6 + ": " + (s1.equals(s6)));
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION