【问题标题】:How to format Merge Sort array int code to array string code with Java?如何使用 Java 将合并排序数组 int 代码格式化为数组字符串代码?
【发布时间】:2018-05-26 22:07:39
【问题描述】:

所以我有一些代码对数组 int 使用合并排序,我正在尝试格式化代码,以便它与数组字符串一起使用,而不是让它按字母顺序排序,所以 ["peas", "zucchini", " apple", "berries"] 变成 ["apple", "berries", "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++;
   }
 }
}

【问题讨论】:

    标签: java arrays string int mergesort


    【解决方案1】:

    您几乎唯一需要更改的是“第三部分”中的部分,您可以在其中比较两个数组元素以查看哪个更大。显然,您不能在 String 上使用像 'compareTo(String s) 方法,该方法返回一个正数或负数的 int 值,具体取决于比较的 String 在字典上是否更高或更低,如果相等则为零。更多详情请查看Java API

    注意: 显然你需要将 int-Array 更改为 String-Array 来,但我认为这是不言而喻的......

    【讨论】:

    • 正确!即在合并方法的第一个 if 子句中,将
    • 所以我只需要更改 if (first[iFirst]
    • 这是你想比较第一个字符串的字符串,在你的情况下,我假设第二个[iSecond]。 API 中记录了与此相关的所有其他内容。
    【解决方案2】:

    首先您将删除 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])

    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++;
       }
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 2010-11-13
      • 2012-11-19
      • 2014-05-26
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多