Как форматировать массив массива сортировки слиянием в код строки массива с помощью Java? - PullRequest
0 голосов
/ 27 мая 2018

Итак, у меня есть некоторый код, который использует сортировку слиянием для массива int, и я пытаюсь отформатировать код так, чтобы он работал со строками массива, а не сортировать их по алфавиту, так что ["peas", "zucchini", "яблоко "," ягоды "] превращается в [" яблоко "," ягоды "," горох "," цуккини "].Если бы кто-нибудь мог мне помочь, это было бы здорово и высоко ценится.

Вот мой код

import java.util.Arrays;

public class MergeSortDemo
{
public static void main(String[] args)
 {
  int[] a = ArrayUtil.randomIntArray(20, 100);
  System.out.println(Arrays.toString(a));

  MergeSorter sorter = new MergeSorter(a);
  sorter.sort();
  System.out.println(Arrays.toString(a));
 }
}

Вторая часть

import java.util.Random;

public class ArrayUtil
{

private static Random generator = new Random();

public static int[] randomIntArray(int length, int n)
{
int[] a = new int[length];

for (int i = 0; i < a.length; i++)
a[i] = generator.nextInt(n);

return a; 
 }
}

Финальная часть

 public class MergeSorter
 {
  private int[] a;

  public MergeSorter(int[] anArray)
  {
  a = anArray;
  }


  public void sort()
  { 
  if (a.length <= 1) return;
  int[] first = new int[a.length / 2];
  int[] second = new int[a.length - first.length];

  for (int i = 0; i < first.length; i++) { first[i] = a[i]; }
  for (int i = 0; i < second.length; i++)
  {
     second[i] = a[first.length + i];
  }
  MergeSorter firstSorter = new MergeSorter(first);
  MergeSorter secondSorter = new MergeSorter(second);
  firstSorter.sort();
  secondSorter.sort();
  merge(first, second);
  }

private void merge(int[] first, int[] second)
 {  
  int iFirst = 0;
  int iSecond = 0;
  int j = 0;

  while (iFirst < first.length && iSecond < second.length)
  {
     if (first[iFirst] < second[iSecond])
     {
        a[j] = first[iFirst];
        iFirst++;
     }
     else
     {
        a[j] = second[iSecond];
        iSecond++;
     }
     j++;
  }
  while (iFirst < first.length)
  {
     a[j] = first[iFirst];
     iFirst++; j++;
  }

  while (iSecond < second.length)
  {
     a[j] = second[iSecond];
     iSecond++; j++;
   }
 }
}

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

сначала вы удалите класс ArrayUtil, создадите и инициализируете свой массив в классе MergeSortDemo и измените тип массива на String. Здесь будет класс MergeSortDemo.

import java.util.Arrays;

public class MergeSortDemo
{
  public static void main(String[] args) {
        // TODO code application logic here

  String [] a = {"peas", "zucchini", "apple", "berries"};
  System.out.println(Arrays.toString(a));

  MergeSorter sorter = new MergeSorter(a);
 sorter.sort();
 System.out.println(Arrays.toString(a));
    }

}

в последней части, которую вы изменитекаждый массив int в массив String и ваше условие будет >> (first [iFirst] .compareTo (second [iSecond]) <0), я вижу (<0), потому что метод CompareTo вернет значение меньше 0, если на одну строку меньшечем другие. Здесь будет класс MergeSorter.</p>

class MergeSorter
 {
  private String[] a;

  public MergeSorter(String[] anArray)
  {
  a = anArray;
  }


  public void sort()
  { 
  if (a.length <= 1) return;
  String[] first = new String[a.length / 2];
  String[] second = new String[a.length - first.length];

  for (int i = 0; i < first.length; i++) { first[i] = a[i]; }
  for (int i = 0; i < second.length; i++)
  {
     second[i] = a[first.length + i];
  }
  MergeSorter firstSorter = new MergeSorter(first);
  MergeSorter secondSorter = new MergeSorter(second);
  firstSorter.sort();
  secondSorter.sort();
  merge(first, second);
  }

private void merge(String[] first, String[] second)
 {  
  int iFirst = 0;
  int iSecond = 0;
  int j = 0;

  while (iFirst < first.length && iSecond < second.length)
  {
     if (first[iFirst].compareTo(second[iSecond])<0)
     {
        a[j] = first[iFirst];
        iFirst++;
     }
     else
     {
        a[j] = second[iSecond];
        iSecond++;
     }
     j++;
  }
  while (iFirst < first.length)
  {
     a[j] = first[iFirst];
     iFirst++; j++;
  }

  while (iSecond < second.length)
  {
     a[j] = second[iSecond];
     iSecond++; j++;
   }
 }
}
0 голосов
/ 27 мая 2018

Практически единственное, что вам нужно изменить, - это часть в «третьей части», где вы сравниваете два элемента массива, чтобы увидеть, какой из них больше.Очевидно, что вы не можете использовать бинарный оператор, такой как «<», в классе String, но класс String предлагает метод <code>compareTo(String s), который возвращает положительное или отрицательное значение int, в зависимости от того, является ли сравниваемая строка лексикографически выше.или ниже, или ноль, если они равны.Для более подробной информации смотрите Java API .

Примечание: Очевидно, вам нужно изменить int-Array на String-Array, но я думаю, чтобез слов ...

...