İçerikler :

Aynı Karakter Sayılı Rastgele String Üretilme.. Bir Byte Dizisini Hex String'e Çeviren Örnek Bir Cümlenin Kelimelerin İlk Harfini Büyük Ha.. Bir String'in Hex (Hexadecimal) Karşılığının .. Java'da Bir String İçinde Bazı Kelimelerin Ge.. java-diff-utils API'si ile String Karşılaştır.. Java ile Sözcüğü Hecelere Ayırma ve Hece Sayı.. Pool String Havuzu SecureRandom ile Belirli Karakterlerle String.. String

Bu Sayfayı Paylaş:

Kavram

String

Tanım: Bir veya birden fazla karakteri barındıran bir sınıf ve bu sınıfa ait olan nesne. Örneğin String s="Ali123" şeklinde bir String nesnesi tanımlanabilir

Örnek

Java'da Bir String İçinde Bazı Kelimelerin Geçip Geçmediğini Bulan Örnek

Aşağıdaki örnekte bir yazı içinde , bazı kelimelerin geçip geçmediğini buluna örnek görülmektedir : 

public static void main(String[] args) {
        
    String[] words=new String[]{"Ali","Veli","Kemal"};
        
    StringBuffer buffer = new StringBuffer();
    for (String word : words) {
        if (buffer.length() != 0) {
            buffer.append("|");
        }
        buffer.append("(\\b");
        buffer.append(word);
        buffer.append("\\b)");
    }

    Pattern pattern = Pattern.compile(buffer.toString(), 
                Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
    
    String text="Bu gece çok güzel olacak " +
                "değil mi Ali kemal ?"; 
    
    Matcher matcher = pattern.matcher(text);
    
    System.out.println(matcher.find());
}

Ali , Veli ve Kemal kelimeleri kontrol edilecek kelimelerdir. Bu kelimele kullanılarak basit bir regular expression oluşturulmuştur. Daha sonra Pattern class'ı kullanılarak verilen kelimelerin olup olmadığı kontrol kontrol edilmekte ve sonuç ekrana basılmaktadır.


İpucu

Bir String'in Hex (Hexadecimal) Karşılığının Bulunması

Bir String'i bir hexadecimal String'e çevirmek için aşağıdaki gibi fonksiyon kullanılabilir:
public String toHex(String string){
	char[] chars = string.toCharArray();
	StringBuffer hex = new StringBuffer();
	for(int i = 0; i < chars.length; i++){
		hex.append(Integer.toHexString((int)chars[i]));
	}
	return hex.toString();
}

Örnek

Bir Byte Dizisini Hex String'e Çeviren Örnek

Verilen bir byte dizisi, Hex string'e çeviren örnek aşağıdaki gibidir:
import java.security.NoSuchAlgorithmException;
public class ByteToHex {
	public static String hex(byte[] byteArray) throws NoSuchAlgorithmException {
		StringBuffer hexString = new StringBuffer();
		for (int i = 0; i < byteArray.length; i++) {
			if ((0xff & byteArray[i]) < 0x10) {
				hexString.append("0" + Integer.toHexString((0xFF & byteArray[i])));
			} else {
				hexString.append(Integer.toHexString(0xFF & byteArray[i]));
			}
		}
		return hexString.toString();
	}
	public static void main(String[] args) throws NoSuchAlgorithmException {
		String hex=ByteToHex.hex("fibiler".getBytes());	
		System.out.println("hex:"+hex);
	}
}
Bir byte değeri için 0xFF ile & (and) operatörü uygulanır ise , negatif sayılar için negatiflik özelliği kaldırılmaktadır. Bu fonksiyon aynı byte'a hep aynı hex değerini vermesi içindir. Verilen byte'ların içeriği değiştirildiğine dikkat etmeniz gerekir.
Integer.toHexString method ile bir int değerinin Hex karşılığı alınır. Eğer sayı tek rakamlı ise başına 0 eklenmiştir.
Kod çalıştırıldığında
hex:666962696c6572
şeklinde ekrana basılacaktır.

Örnek

Bir Cümlenin Kelimelerin İlk Harfini Büyük Harf Yapan Örnek

Aşağıdaki örnek sınıfta, bir cümlenin kelimelerinin ilk harflerini büyüten örnek görülmektedir :
public class StringHelper {
	
	public static String toTitleCase(String text) {
		
		if(text==null){
			return text;
		}
		
	    String[] array = text.split(" ");
	    
	    StringBuffer sb = new StringBuffer();
	    
	    for (int i = 0; i < array.length; i++) {
	    	
	        sb.append(Character.toUpperCase(array[i].charAt(0)))
	            .append(array[i].substring(1)).append(" ");
	        
	    }     
	    
	    return sb.toString().trim();
	}  
	
	public static void main(String[] args) {
		
		System.out.println(toTitleCase("en hakiki murşit ilimdir fendir"));
		
	}
}

Örnek

Aynı Karakter Sayılı Rastgele String Üretilmesi

Şifre (password) veya ID üretmek için aynı karakter sayısında rastgele String üretebilirsiniz. Bunun için Apache Lang kütüphanesi kullanılabilir. Aşağıdaki örnek farklı şekillerde String'ler üretilmiştir :
import org.apache.commons.lang.RandomStringUtils;

public class RandomStringUtilsTest {

	public static void main(String[] args) {

		System.out.println(RandomStringUtils.random(10));

		System.out.println(RandomStringUtils.randomAscii(10));

		System.out.println(RandomStringUtils.randomAlphabetic(10));

		System.out.println(RandomStringUtils.randomNumeric(10));

		System.out.println(RandomStringUtils.randomAlphanumeric(10));

	}

}
Uygulama çalıştırıldığında aşağıkdaki gibi çıktı oluşabilir : ????????? m8m-Kdjsly TILdVbdWpo 7718949159 i4KDz23KeC Görüldüğü gibi hep 10 karakter üretilmiştir. İlk örnekte gözükmeyen karakterlerin de üretilmesi nedeniyle ? şeklinde görülmüştür. Diğerlerinde ASCII , numeric , alfabetik ve alfanumeric şeklinde 10 karakterli şifreler üretilmiştir. Apache Lang projesi için aşağıdaki gibi Maven bilgisini ekleyebilirsiniz:
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
	<groupId>commons-lang</groupId>
	<artifactId>commons-lang</artifactId>
	<version>2.6</version>
</dependency>

Örnek

SecureRandom ile Belirli Karakterlerle String Üretilmesi

Şifre (password) veya ID üretmek için aynı karakter sayısında belirli bir karakter seti ile rastgele String üretebilirsiniz:
import java.security.SecureRandom;

public class SecureRandomStringTest {
	
	static final String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

	public static void main(String[] args) {

		SecureRandom rnd = new SecureRandom();

		StringBuilder sb = new StringBuilder(5);

		for (int i = 0; i < 5; i++) {

			sb.append(CHARS.charAt(rnd.nextInt(CHARS.length())));

		}

		System.out.println(sb.toString());

	}
}
CHARS değişkeninde belirtilen karakterler kullanılmıştır. SecureRandom ile rastgele index değeri üretilmiş ve CHARS değişkeninin o index'teki değeri kullanılıyor. Uygulama çalıştığında aşağıdaki gibi şifreler üretilebilir: mV1uL Xpy1u SXo9I

Veri

Pool String Havuzu

Java'da "" şeklinde verilen String'ler bir havuzda tutulur. Başka bir yerde "" ile aynı String tanımlanırsa bu havuzdaki String kullanılır. Java'da
String s="Ali";
şeklinde bir String tanımlandığında "Ali" ifadesi String havuzunda saklanmaktadır. Bu nedenle aşağıdaki gibi bir karşılaştırma true sonucu verir. Çünkü havuzda aynı String'e karşılık gelmektedir:
public class StringPoolTest {
	
	public static void main(String[] args) {
		
		String a="Ali";
		String b="Ali";
		
		if(a==b) {
			System.out.println("true");
		}else {
			System.out.println("false");
		}
	}

}
Uygulamayı çalıştırdığınızda çıktıya true yazacaktır. Ancak ikinci String "" ile değil de new String("Ali") ile yaratsaydık bu String havuzda olmayacaktır ve false cevabı alınacaktı. Aşağıdaki örnek false sonucu verecektir:
public class StringPoolInternTest {
	
	public static void main(String[] args) {
		
		String a="Ali";
		String b=new String("Ali");
		
		if(a==b) {
			System.out.println("true");
		}else {
			System.out.println("false");
		}
	}

}

Eğer bir String nesnesinin String'ini havuza eklenmesi isteniyorsa intern() yöntemi kullanılır. Bu yöntem geriye havuza eklenmiş String verir:
public class StringPoolInternTest {
	
	public static void main(String[] args) {
		
		String a="Ali";
		String b=new String("Ali");
		
		if(a==b) {
			System.out.println("true");
		}else {
			System.out.println("false");
		}
		
		b=b.intern();
		
		if(a==b) {
			System.out.println("true");
		}else {
			System.out.println("false");
		}
	}

}
Uygulama çalıştığında ilk olarak false yazar. Ancak intern() yöntemi çağrıldıktan nsonra kontrol edildiğinde true sonucu basar.

Veri

java-diff-utils API'si ile String Karşılaştırma

Java'da iki string arasındaki oluşan farkları karşılaştırmak için java-diff-utils kütüphanesi kullanılabilir. Aşağıdaki bağımlılığı ekleyelim:
<dependency>
	<groupId>io.github.java-diff-utils</groupId>
	<artifactId>java-diff-utils</artifactId>
	<version>4.0</version>
</dependency>
Aşağıdaki örnekte iki string karşılaştırılmaktadır :
import com.github.difflib.algorithm.DiffException;
import com.github.difflib.text.DiffRow;
import com.github.difflib.text.DiffRowGenerator;

public class Test {

	public static void main(String[] args) throws DiffException {
		
		DiffRowGenerator generator = DiffRowGenerator.create()
                .showInlineDiffs(true)
                .mergeOriginalRevised(true)
                .inlineDiffByWord(true)
                .oldTag(f -> "~")      //introduce markdown style for strikethrough
                .)newTag(f -> "**")     //introduce markdown style for bold
                .build();
		
		String text1="a Example is sucessfull\r\n" + 
				"this is true\r\n" + 
				"but if else";
		String text2="an Example is successfull\r\n" + 
				"this is false\r\n" + 
				"but if else if";
		
		List<DiffRow> rows = generator.generateDiffRows(Arrays.asList(text1), Arrays.asList(text2));
		
		for (DiffRow diffRow : rows) {
			System.out.println(diffRow.getOldLine());
		}		
	}
}
Bu uygulama çalıştırıldığında aşağıdaki gibi çıktı üretir :
~a~**an** Example is ~sucessfull~**successfull**

this is ~true~**false**

but if else** if**
İlk satırda a ifadesi silinip an yapılmış, sucessfull ifadesi düzeltilip successfull yapılmış. İkinci satırda true yerine false yapılmış. Üçüncü satırda ise fazladan bir if eklenmiş. Görüldüğü gibi hepsi tespit edilmiştir. Eğer eski ve yenisini aynı anda görmek istiyorsanız aşağıdaki gibi yapabilirsiniz :
import java.util.Arrays;
import java.util.List;

import com.github.difflib.algorithm.DiffException;
import com.github.difflib.text.DiffRow;
import com.github.difflib.text.DiffRowGenerator;

public class TestDelta3 {

	public static void main(String[] args) throws DiffException {
		
		DiffRowGenerator generator = DiffRowGenerator.create()
                .showInlineDiffs(true)
                .inlineDiffByWord(true)
                .oldTag(f -> "~")
                .newTag(f -> "**")
                .build();
		
		String text1="a Example is sucessfull\r\n" + 
				"this is true\r\n" + 
				"but if else";
		String text2="an Example is successfull\r\n" + 
				"this is false\r\n" + 
				"but if else if";
		
		List<DiffRow> rows = generator.generateDiffRows(Arrays.asList(text1), Arrays.asList(text2));
		
		for (DiffRow row : rows) {
		    System.out.println(row.getOldLine() + "--->" + row.getNewLine());
		    System.out.println();
		}	
	}	
}
Bu uygulama çalıştırıldığında aşağıdaki gibi bir çıktı üretecektir :
~a~ Example is ~sucessfull~
--->**an** Example is **successfull**

this is ~true~
--->this is **false**

but if else--->but if else** if**
Görüldüğü gibi eski satırda silinenler ~ ile gösterilirken, yeni kayıtta ** şeklinde gösterilir.

Veri

Java ile Sözcüğü Hecelere Ayırma ve Hece Sayısını Bulma

Türkçe için hecelere ayırma algoritması şu şekildedir. Verilen metnin son ünlüsü tespit edilir. Bu ünlüden önceki ünsüz ise o ünsüz dahil edilerek sözcük sonuna kadar hece kabul edilir ve bir listeye eklenir. Eklenen heceden geri kalan sözcük için tekrar aynı yöntem uygulanır. Elde ünlü kalmayan son durum da hece listesine eklenir. En son da eklenen liste tersine çevrilir. Basit bir uygulama aşağıdaki gibidir :
public void parse(String text) {
	syllable=new ArrayList<String>();
	syllable(text);
	Collections.reverse(syllable);			
}
void syllable(String text) {
	
	if(text==null||text.isEmpty()) {
		return;
	}
	
	int lastIndex=TurkishLanguage.findLastVowelIndex(text);
	if(lastIndex>0) {
		if(TurkishLanguage.isVowel(text.charAt(lastIndex-1))) {
			syllable.add(text.substring(lastIndex));
			syllable(text.substring(0,lastIndex));
		}else {
			syllable.add(text.substring(lastIndex-1));
			syllable(text.substring(0,lastIndex-1));
		}
	}else {
		syllable.add(text);
		return;
	}
	
}
TurkishLanguage.findLastVowelIndex yöntemi son ünlünün index'ini veren bir yöntemdir :
public static Character findLastVowel(String word) {
	for (int i = word.length() - 1; i >= 0; i--) {
		char c = word.charAt(i);
		if (TurkishLanguage.isVowel(c)) {
			return c;
		}
	}
	return null;
}
TurkishLanguage.isVowel(c) ile bir karakter ünlü mü değil mi döndüren basit bir yöntemdir.
Örneğimizde son bir ünlü metni içinde var ise bir önceki ses ünlü ise ünlüyü dahil edip en sona kadar kısmı alıyoruz ve hece listesine ekliyor. Geri kalan metni sürece devam etmesi için aynı yönteme yönlendiriyoruz. Eğer son ünlüden önceki ünsüz ise bu ünsüz dahil ederek heceyi alıyoruz ve geri kalanı yine aynı yönteme yönlendiriyoruz. syllable listesi parçalanan heceleri tutan bir liste. Süreç bittikten sonra bu liste ters çevrildiğinde heceler doğru sırada verilmiş olunur.
Aşağıdaki gibi basit testler yapılarak doğrulanabilir :
@Test
public void parseTest() {
	
	String text="katanlardan";
	
	SyllableParser parser=new SyllableParser();
	parser.parse(text);
	
	System.out.println(parser.getSyllable());
}
Çıktı aşağıdaki gibi olacaktır :
[ka, tan, lar, dan]
Bu yöntem tren gibi, sarımtrak, elektrik, spor gibi sözcüklerde işe yaramamaktadır. Bu yöntem yerine daha gelişmiş bir yöntem gerekir.
Hece sayısı ise bir sözcükteki ünlü sesleri sayarak yapılabilir. Sadece saat, babaanne gibi iki ünlünün yan yana geldiği örneklerde değeri vermez.
public int getCountSyllable(String text) {
	Pattern p = Pattern.compile("[aAeEiİıIoOöÖuUüÜâÂûÛîÎ]", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
	Matcher m = p.matcher(text);
					
	int i=0;
	while (m.find()) {
	   i++;
	}		
	return i;
}
Java 9 ve sonrası için döngü açıp saymak yerine aşağıdaki gibi bulunabilir:
int count=(int) m.results().count();




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir