System.arraycopy does not do a deep copy. I just tried it. But it is
very fast. <grin>

I setup the timing test. I did 5000 passes over the copy loops;

  522 ms    for (i=0; i<3; i++) a[i] = b[i].clone();
  453 ms    for(i=3; i-->0;) a[i] = b[i].clone();
  447 ms    int pos = 0; for(type x; b) a[pos++] = x.clone();

I had written a type.clone() to make the deep copy for each array
element. I was surprised that the for_each version did so well. I
won't put much faith in the timing differences between it and the
subtraction version.

Rud
http://mysticlakesoftware.blogspot.com/


On Aug 25, 8:00 am, Peli <peli0...@googlemail.com> wrote:
> To deep copy an array, you can use 
> System.arraycopy(..)http://developer.android.com/reference/java/lang/System.html#arraycop...
>
> System.arraycopy(b, 0, a, 0, 3);
>
> but for a float array of length 3, you can simply write
> a[0]=b[0];
> a[1]=b[1];
> a[2]=b[2];
>
> or
> for (i=0; i<3; i++) a[i] = b[i];
>
> I've never tried to profile which of the 3 ways is actually the
> fastest on a real Android device. If someone has the time, please try
> all 3 in a tight loop and report back :-)
>
> (there is also
> for(i=3; i-->0;) a[i] = b[i];
> which may be even faster?)
>
> Note: all assume that you have initialized a already beforehand,
> a = new float[3];
>
> Peli
>
> On Aug 25, 8:24 am, Rud <rudmerr...@gmail.com> wrote:
>
>
>
> > Hi,
>
> > The code is originally from my Blog. The reason for the clone is
> > explained there.
>
> > I admit to not having worked with Java enough to have the deep
> > understanding of how containers deal with objects. In my application I
> > ran into a problem trying to make a copy of an array and had to write
> > my own copy.
>
> > I had a set of data that gets consumed while the app runs. I wanted to
> > reset that data at times. I put the data in an array and then cloned
> > it to the working array. I was surprised when the original data got
> > changed when the cloned data was changed. I also realized that the
> > sensor code wasn't doing what I thought it was but haven't taken the
> > time to adjust it.
>
> > How in Java do you actually make a deep copy of an array?
>
> > Rudhttp://mysticlakesoftware.blogspot.com/
>
> > On Aug 21, 7:07 am, Peli <peli0...@googlemail.com> wrote:
>
> > > > .... = event.values.clone();
>
> > > Note that this creates new objects constantly that have to be garbage
> > > collected later. Depending on the kind of application, it may be
> > > better to just copy the values into a persisting array.
>
> > > Peliwww.openintents.org
>
> > > On Aug 21, 4:06 am, mscwd01 <mscw...@gmail.com> wrote:
>
> > > > Heres my code, which works:
>
> > > > public void onSensorChanged(SensorEvent event) {
>
> > > >         Sensor sensor = event.sensor;
> > > >         int type = sensor.getType();
> > > >         switch (type) {
> > > >                 case Sensor.TYPE_MAGNETIC_FIELD:
> > > >                         mags = event.values.clone();
> > > >                         isReady = true;
> > > >                     break;
> > > >                 case Sensor.TYPE_ACCELEROMETER:
> > > >                     accels = event.values.clone();
> > > >                     break;
> > > >                 case Sensor.TYPE_ORIENTATION:
> > > >                     orients = event.values.clone();
> > > >                     break;
> > > >             }
>
> > > >             if (mags != null && accels != null && isReady) {
> > > >                 isReady = false;
>
> > > >                     SensorManager.getRotationMatrix(R, I, accels, mags);
> > > >                     SensorManager.remapCoordinateSystem(R,
> > > > SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, outR);
> > > >                     SensorManager.getOrientation(outR, values);
>
> > > >                                 azimuth = 
> > > > getAzimuth(-convert.radToDeg(values[0]));
> > > >                                 pitch= convert.radToDeg(values[1]);
> > > >                                 roll = -convert.radToDeg(values[2]);
>
> > > >             }
>
> > > >         }
>
> > > > On Aug 21, 2:39 am, Mike Collins <mike.d.coll...@gmail.com> wrote:
>
> > > > > I have a sensor event handler that gets fired and I have no problem
> > > > > getting and processing acceleration readings. However this code
> > > > > always fails.
>
> > > > >                 if (event.sensor.getType() == 
> > > > > Sensor.TYPE_ACCELEROMETER)
> > > > >                 {
> > > > >                         float[] geomagnetic = new float[3];
> > > > >                         geomagnetic[0] = geomagnetic[1] = 
> > > > > geomagnetic[2] = 0;
>
> > > > >                         float[] r = new float[9];
> > > > >                         float[] I = new float[9];
> > > > >                         boolean b = 
> > > > > SensorManager.getRotationMatrix(r, I, event.values.clone
> > > > > (), event.values.clone());
> > > > >                         if ( ! b)
> > > > >                         {
> > > > >                                 Log.e(LOG_TAG, "getRotationMatrix 
> > > > > failed");
> > > > >                                 return;
> > > > >                         }
> > > > > ...
>
> > > > > tia,
> > > > >   mike- Hide quoted text -
>
> > > - Show quoted text -- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to