1 Temmuz 2019 Pazartesi

Arrays Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.Arrays;
Java'da Array sınıfını genişletmek mümkün olmadığı için bu tür tamamen static metodlardan oluşan utility sınıfları ortaya çıkmıştır. Benzer mantık ArrayFilesObjects gibi utility sınıflarında da görülebilir.

asList metodu
Arrays.asList metodu yazısına taşıdım

binarySearch metodu
Collections.binarySearch ile aynıdır. Metodun imzası şöyle
Arrays.binarySearch(Object[] array, Object key)
copyOf metodu - original + length
copyOf() metodu ile orijinal dizinin kopyası veya daha büyük bir dizi veya daha küçük bir dizi döndürülebilir. Yeni dizinin uzunluğu eskisinden fazla ise 0 ile doldurur. Kısa ise kırpar.

Örnek
Kopya döndürmek için şöyle yaparız.
int[] a = new int[4];
...
int[] b = Arrays.copyOf (a, a.length);
Örnek
İki diziyi birleştirmek için şöyle yaparız. arraycopy parametreleri src + srcPosition + dest+ destPositon + length
static float[] concat (float[] first, float[] second) {
  float[] both = Arrays.copyOf(first, first.length+second.length);
  System.arraycopy(second, 0, both, first.length, second.length);
  return both;
}
Örnek
Elimizde şöyle bir kod olsun.
int size = ...;
float[] array = ...;
İki diziyi birleştirmek için şöyle yaparız.
FloatArray combine(FloatArray other) {
  float[] resultArray = new float[array.length + other.array.length];
  System.arraycopy(this.array, 0, resultArray, 0, size);
  System.arraycopy(other.array, 0, resultArray, size, other.size);
  this.array = resultArray;
  this.size += other.size;
  return this;
}
Örnek
Elimizde şöyle bir kod olsun.
int size = ...;
float[] array = ...;
Dizinin uzunluğunu artırmak için şöyle yaparız.
void add(float f) {
  if (size == array.length) {
    array = Arrays.copyOf(array, array.length * 2);
  }
  array[size++] = f;
}
copyOf metodu - original + length + new type
Array içindeki nesneleri başka bir array'e tipini değiştirerek kopyalar.
Object[] a = Arrays.copyOf (new String[] { "hello", "world" }, 3, Object[].class);
Metodun içi şöyledir.
static <T,U> T[] copyOf(U[] original,int newLength, Class<? extends T[]> newType){
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}
copyOfRange metodu
Örnek
Şöyle yaparız
private static int[] copyArray1(){
  int[] numbers = {1,2,3,4,5,6,7};
  int[] subArray = Arrays.copyOfRange(numbers,3,numbers.length);
  System.out.println(Arrays.toString(subArray));
  return subArray;
}
Aynı şeyi Stream kullanarak şöyle yaparız
int[] numbers = {1,2,3,4,5,6,7};
int[] subArray = IntStream
                .range(0, numbers.length)
                .filter(i -> i > 3)
                .map(a->numbers[a]).toArray();

System.out.println(Arrays.toString(subArray));
deepEquals metodu
Şöyle yaparız.
int[][] workingPuzzle = ...; int[][] solvedPuzzle = ...;

boolean result = Arrays.deepEquals (workingPuzzle, solvedPuzzle);
Objects.deepEquals allta bu metodu kullanır.
public static boolean deepEquals(Object a, Object b) {
    if (a == b)
        return true;
    else if (a == null || b == null)
        return false;
    else
        return Arrays.deepEquals0(a, b);
}
deepHashCode metodu
Açıklaması şöyle. Çok boyutlu veya Object içeren diziler için kullanılır
Arrays.hashCode():
This method is used to compute a hash code for a one-dimensional array. It considers the content of the array elements while calculating the hash code. In other words, it uses the elements' values to determine the hash code.

Arrays.deepHashCode():
This method is used to compute a hash code for a multi-dimensional array (array of arrays) or an array containing nested objects. It not only considers the content of the top-level array but also recursively calculates hash codes for the nested arrays or objects within the array.
deepToString metodu
İki boyutlu diziyi string haline getirir.
Örnek
Şöyle yaparız.
String[][] users =  ...;
System.out.println(Arrays.deepToString (users));
Örnek
Şöyle yaparız.
int[][] arr = new int[4][3];
...
System.out.println("Array: " + Arrays.toString(array));
fill metodu
Şöyle yaparız.
String[] names= new String[5];
Arrays.fill(names,"");
mismatch metodu
Açıklaması şöyle
Returns the index of the first non-matching element in 2 arrays (Java 9).

parallelPrefix metodu
parallelPrefix metodu yazısına taşıdım

parallelSetAll metodu

Bir dizinin elemanlarına paralel olarak değer atar. Örnek ver

parallelSort metodu
Metodun imzası şöyle. İlk parametre sıralanacak dizi, ikinci parametre ise sıralama için kullanılacak karşılaştırma işlemini belirtir.
static <T> void parallelSort(T[] a, Comparator<? super T> cmp))

Açıklaması şöyle.
- it uses the ForkJoinPool.commonPool() and will fight with other functions that use it by default (e.g. parallel() on a stream)
- the thread-pool Arrays.parallelSort uses is not configurable (only on a global level by increasing the common-pools thread amount)
- it performs worse on small data sets (more often than not arrays contain little elements, the JDK even acknowledges that e.g. most ArrayList stay empty for their whole lifetime which saves quite a bit of memory and CPU time for not instantiating arrays that will never be filled)
Örnek
Şöyle yaparız.
Integer[] one = {2,5,8,1,3,4,9};
Arrays.parallelSort(one, (p1, p2) -> p2 - p1);
setAll metodu
İmzası şöyle.
<T> void Arrays.setAll(T[] array, IntFunction<T> generator)
Örnek
Şöyle yaparız.
int[] arr = new int[10];
Arrays.setAll(arr, i -> i*2);
// array is filled with [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] now
sort metodu
Şöyle yaparız.
int arr[] = ...
Arrays.sort(arr);
Eğer kendi Comparator nesnemizi sağlamak istersek şöyle yaparız.
Arrays.sort(arr, new Comparator<String>() {
  public int compare(String s1, String s2) {
  ...     
  } 
});
stream metodu
Java 8 ile gelen stream() metodu şöyle çalışıyor.
int[] array = {3, 2, 5, 4};

if (Arrays.stream(array).anyMatch(x -> x == 3)) {
    System.out.println("The array contains 3");
}
toString
Elimizde şöyle bir array olsun.
final static int SIZE = 15;
int[] arrayOfInts = new int[SIZE];
Bu array'i yazdırırsak
System.out.println(arrayOfInts);
Şöyle bir çıktı alırız.
[I@15db9742
Örnek
Eğer içindekileri yazdırmak istiyorsak şöyle yaparız.
System.out.println(Arrays.toString(arrayOfInts));
Örnek
Elimizde şöyle bir dizi olsun
Integer[] secondArray = {2,3,4,5,6,11,12,123};
System.out.println("values:" + Arrays.toString(secondArray));
Çıktı olarak şunu alırız.
2, 3, 4, 5, 6, 11, 12, 123
Dolayısıyla bazı kodlardaki şu gibi metodlara aslında ihtiyaç yok.
private static void printArray(int[] anArray) {
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < anArray.length; i++) {
    if (i > 0) {
      sb.append(", ");
    }
    sb.append(anArray[i]);
  }
  System.out.println(sb.toString());
}



Hiç yorum yok:

Yorum Gönder