簡體   English   中英

在Java中將列表分為兩部分

[英]splitting the list in two parts in java

我在for循環中有一個數組,該數組首先要轉換為列表,然后分成兩半,列表的第一部分存儲在s1列表中,第二部分存儲在w1中,這將是遞歸地完成,直到循環結束,在方法的最后,我將同時返回s1和w1,這是我到目前為止所做的代碼:

   public Pair daubTrans( double s[] ) throws Exception
    {
     final int N = s.length;
      int n;
    //double t1[] = new double[100000];
     //List<Double> t1 = new ArrayList<Double>();
    // double s1[] = new double[100000];
    List<double[]> w1 = new ArrayList<double[]>();
  List<double[]> s1 = new ArrayList<double[]>();
 List<double[]> lList = new ArrayList<double[]>();
  //List<double[]> t1 = new ArrayList<double[]>();

  for (n = N; n >= 4; n >>= 1) {
      double[] t1=  transform( s, n );
      int length = t1.length;
     // System.out.println(n);
     // LinkedList<double> t1 =new LinkedList<double>( Arrays.asList(t1));

     /* for(double[] d: t1)
      {
          t1.add(d);
      }*/

      lList = Arrays.asList(t1);
      length=lList.size();
      //System.out.print(lList.size());

     // System.arraycopy(src, srcPos, dest, destPos, length)
/*   s1= t1.subList(0, 1);
     w1= t1.subList(0, 1); */
   /*    if(n==N)
     {
     s1= lList.subList(0, length/2-1);
     w1= lList.subList(length/2-1, length);
     }
     else
     {
     s1=lList.subList(( length/2), length);
      w1=lList.subList(( length/2), length);
     } */

//    System.arraycopy(t1,0, s1, n==N?0:t1.size()/2-1, t1.size()/2-1);
 // System.arraycopy(t1,(length/2), w1, n==N?0:t1.size()/2-1, t1.size()/2-1);
 // System.out.println(w1.length);

  }
  return new Pair(s1, w1);

 }

其中定義了對類,以便返回2列表,而transform返回一個double類型的數組,該數組存儲在t1數組中。 現在我在將t1數組轉換為列表類型以及如何將t1元素形成的列表拆分為2部分時遇到問題。 轉換代碼為:

      protected  double[] transform( double a[], int n )
    {
       if (n >= 4) {
        int i, j;
       int half = n >> 1;

    double tmp[] = new double[n];

    i = 0;
        for (j = 0; j < n-3; j = j + 2) {
          tmp[i]      = a[j]*h0 + a[j+1]*h1 + a[j+2]*h2 + a[j+3]*h3;
          tmp[i+half] = a[j]*g0 + a[j+1]*g1 + a[j+2]*g2 + a[j+3]*g3;
       i++;
         }
    // System.out.println(i);

     tmp[i]      = a[n-2]*h0 + a[n-1]*h1 + a[0]*h2 + a[1]*h3;
     tmp[i+half] = a[n-2]*g0 + a[n-1]*g1 + a[0]*g2 + a[1]*g3;


     for (i = 0; i < n; i++) {
        a[i] = tmp[i];

     }



  }


return a;
   } // transform

這是整個代碼-:

  import java.util.Arrays;
   import java.util.List;
    import java.util.*;
     import java.lang.Math.*;

  class daub {
   protected final double sqrt_3 = Math.sqrt( 3 );
   protected final double denom = 4 * Math.sqrt( 2 );
    //
    // forward transform scaling (smoothing) coefficients
    //
    protected final double h0 = (1 + sqrt_3)/denom;
      protected final double h1 = (3 + sqrt_3)/denom; 
           protected final double h2 = (3 - sqrt_3)/denom; 
              protected final double h3 = (1 - sqrt_3)/denom;
         //
    // forward transform wavelet coefficients
        //
            protected final double g0 =  h3;
           protected final double g1 = -h2;
               protected final double g2 =  h1;
                protected final double g3 = -h0;

          //
           // Inverse transform coefficients for smoothed values
           //
           protected final double Ih0 = h2;
             protected final double Ih1 = g2;  // h1
           protected final double Ih2 = h0;
            protected final double Ih3 = g0;  // h3
           //
          // Inverse transform for wavelet values
               //
            protected final double Ig0 = h3;
         protected final double Ig1 = g3;  // -h0
           protected final double Ig2 = h1;
           protected final double Ig3 = g1;  // -h2
             List<Double> doubleList = new ArrayList<Double>();
       /**
        <p>
           Forward wavelet transform.

       protected  double[] transform( double a[], int n )
     {
  if (n >= 4) {
     int i, j;
     int half = n >> 1;

 double tmp[] = new double[n];

 i = 0;
     for (j = 0; j < n-3; j = j + 2) {
        tmp[i]      = a[j]*h0 + a[j+1]*h1 + a[j+2]*h2 + a[j+3]*h3;
        tmp[i+half] = a[j]*g0 + a[j+1]*g1 + a[j+2]*g2 + a[j+3]*g3;
    i++;
     }
    // System.out.println(i);

     tmp[i]      = a[n-2]*h0 + a[n-1]*h1 + a[0]*h2 + a[1]*h3;
     tmp[i+half] = a[n-2]*g0 + a[n-1]*g1 + a[0]*g2 + a[1]*g3;


     for (i = 0; i < n; i++) {
        a[i] = tmp[i];

     }



  }


return a;

} // 轉變

         protected void invTransform( double a[], int n )
     {
  if (n >= 4) {
int i, j;
int half = n >> 1;
int halfPls1 = half + 1;

double tmp[] = new double[n];

//      last smooth val  last coef.  first smooth  first coef
tmp[0] = a[half-1]*Ih0 + a[n-1]*Ih1 + a[0]*Ih2 + a[half]*Ih3;
tmp[1] = a[half-1]*Ig0 + a[n-1]*Ig1 + a[0]*Ig2 + a[half]*Ig3;
j = 2;
for (i = 0; i < half-1; i++) {
  //     smooth val     coef. val       smooth val    coef. val
  tmp[j++] = a[i]*Ih0 + a[i+half]*Ih1 + a[i+1]*Ih2 + a[i+halfPls1]*Ih3;
  tmp[j++] = a[i]*Ig0 + a[i+half]*Ig1 + a[i+1]*Ig2 + a[i+halfPls1]*Ig3;
}
for (i = 0; i < n; i++) {
  a[i] = tmp[i];
}
  }
      }


         /**
           Forward Daubechies D4 transform
          */
          public Pair daubTrans( double s[] ) throws Exception
       {
  final int N = s.length;
  int n;
  //double t1[] = new double[100000];
  //List<Double> t1 = new ArrayList<Double>();
 // double s1[] = new double[100000];
  List<double[]> w1 = new ArrayList<double[]>();
  List<double[]> s1 = new ArrayList<double[]>();
 List<double[]> lList = new ArrayList<double[]>();
  //List<double[]> t1 = new ArrayList<double[]>();

  for (n = N; n >= 4; n >>= 1) {
      double[] t1=  transform( s, n );
      int length = t1.length;
     // System.out.println(n);
     // LinkedList<double> t1 =new LinkedList<double>( Arrays.asList(t1));

     /* for(double[] d: t1)
      {
          t1.add(d);
      }*/

      lList = Arrays.asList(t1);
      length=lList.size();
      //System.out.print(lList.size());

     // System.arraycopy(src, srcPos, dest, destPos, length)
/*   s1= t1.subList(0, 1);
     w1= t1.subList(0, 1); */
 if(n==N)
     {
     s1= lList.subList(0, length/2-1);
     w1= lList.subList(length/2-1, length);
     }
     else
     {
     s1=lList.subList(( length/2), length);
      w1=lList.subList(( length/2), length);
     } 

//    System.arraycopy(t1,0, s1, n==N?0:t1.size()/2-1, t1.size()/2-1);
 // System.arraycopy(t1,(length/2), w1, n==N?0:t1.size()/2-1, t1.size()/2-1);
 // System.out.println(w1.length);

  }
  return new Pair(s1, w1);

}

        /**
  1. 請在此問題上添加transform(s,n)代碼transform(s,n)

  2. 為什么這個? for (n = N; n >= 4; n >>= 1) {}似乎更容易: for (int n = N; n >= 4; n--) {}

  3. 這太瘋狂了: List<double[]>如果要使用雙打列表,請使用以下List<double>List<double>

  4. 您想看到什么結果?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM