*
*
* List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack
*
* 讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)
* ArrayList与Vector都是基于数组实现的,这就说明ArrayList与Vector适合做遍历而不适合做频繁的插入和删除。
* vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
* 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.
* 如过在集合中使用数据量比较大的数据,用vector有一定的优势
* LinkedList是基于链表实现的,所以它生来就是为了频繁插入与删除对象。
*
* 讨论2:特殊功能 Stack是一个后进先出(LIFO)对象堆栈,而LinkedList除可以被用作堆栈外,还可以被用作队列或双端队列。
* 不同的是Stack继承自Vector,也就是说它也是基于数组实现的。
*
* 讨论3:内存占用 基于数组实现的List,在动态扩展时会产生新的数组,然后把旧数组里的内容复制到新数组里,
* 这会产生大量的不再被使用的对象引用变量等待系统回收。而基于链表实现的List就不会有这种问题。
*
* 讨论4:同步问题 Vector与Stack生来就是同步的,
* 而ArrayList与LinkedList需要使用Collections.synchronizedList(List list)方法来转换成同步List。
* 从它们的对象上返回的迭代器是快速失败的,也就是说在使用迭代器进行迭代的时候,必须使用迭代器本身的remove、add、set
* 方法来添加或更改List元素,如果在迭代的同时,在其他线程中从结构上修改了List(结构上的修改是指任何添加或删除一个或多
* 个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改),快速失败迭代器会尽最大努力抛出ConcurrentModificationException。
*
* 讨论5:使用策略
* 如果数据被从数据源提取,数据量不确定,该数据一经被提取后就几乎不会再添加或删除,那么应该建立一个LinkedList来保存从数据源中取出的数据,然后将
* 该LinkedList转换成ArrayList来优化遍历操作。反过来,数据量确定的数据从数据源取出可以先建立一个ArrayList来保存,根据需要如需频繁增删,就转换为LinkedList,
* 如频繁遍历就不需转换。
* 转换的方法就是使用对应的List类来封装目标List对象。
* 如 ArrayList al = new ArrayList();
* LinkedList ll = new LinkedList(al);
* 同理反过来也可以 LinkedList ll = new LinkedList();
* ArrayList al = new ArrayList(ll);
*
* 讨论6:toArray()方法
* 基于数组实现的List会直接返回一个底层数组的拷贝(使用了System.arraycopy方法),基于链表实现的List会新生成一个数组。
*
* 讨论7:不可修改 通过使用Collections.unmodifiableList(List
* list)来生成一个不可修改的List,试图修改返回的列表,不管是直接修改还是通过其迭代器进行修改,都将导致抛出UnsupportedOperationException。
*
* 讨论8:遍历器 请尽量使用Iterator,Enumeration已不被鼓励使用。
*/
#功能:当横向滚动条滚到顶端时,左箭头灰掉;当滚到尾端时,右箭头灰掉;当滚到中间时,左右箭头水红色;
效果如下图
<!-- /res/layout/horizontal_view_demo.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="40dp"> <TextView android:id="@+id/h_left" android:layout_width="13dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:background="@color/grey" android:text="<"/> <HorizontalScrollView android:id="@+id/h_horizontal" android:layout_width="200dp" android:layout_height="fill_parent" android:layout_weight="1" android:scrollbars="none"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/h_t1" android:layout_width="70dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:layout_margin="1dp" android:background="#666666" android:text="人事部"/> <TextView android:id="@+id/h_t2" android:layout_width="70dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:layout_margin="1dp" android:background="#666666" android:text="账务部"/> <TextView android:id="@+id/h_t3" android:layout_width="70dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:layout_margin="1dp" android:background="#666666" android:text="技术部"/> <TextView android:id="@+id/h_t4" android:layout_width="70dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:layout_margin="1dp" android:background="#666666" android:text="销售部"/> <TextView android:id="@+id/h_t5" android:layout_width="70dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:layout_margin="1dp" android:background="#666666" android:text="制作部"/> <TextView android:id="@+id/h_t6" android:layout_width="70dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:layout_margin="1dp" android:background="#666666" android:text="设计部"/> <TextView android:id="@+id/h_t7" android:layout_width="70dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:layout_margin="1dp" android:background="#666666" android:text="行政部"/> </LinearLayout> </HorizontalScrollView> <TextView android:id="@+id/h_right" android:layout_width="13dp" android:layout_height="fill_parent" android:textSize="20dp" android:gravity="center" android:background="@color/pink" android:text=">"/> </LinearLayout> </LinearLayout>
public class HorizontalViewDemo extends Activity { private HorizontalScrollView hsv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.horizontal_view_demo); hsv = (HorizontalScrollView)findViewById(R.id.h_horizontal); hsv.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View view, MotionEvent me) { TextView hLeft = (TextView)findViewById(R.id.h_left); TextView hRight = (TextView)findViewById(R.id.h_right); if (hsv.getScrollX() == 0) { hLeft.setBackgroundResource(R.color.grey); } else if (hsv.getScrollX() > 0) { hLeft.setBackgroundResource(R.color.pink); } if (hsv.getScrollX() == 210) {//210这个值在不同像数需要改变 hRight.setBackgroundResource(R.color.grey); } else if (hsv.getScrollX() < 210) { hRight.setBackgroundResource(R.color.pink); } return false; } }); } }
在android中可采用如下代码获取距离:
Java代码
public double getDistance(double lat1, double lon1, double lat2, double lon2) { float[] results=new float[1]; Location.distanceBetween(lat1, lon1, lat2, lon2, results); return results[0]; }
在其他设备若没有类似android的Location的distanceBetween方法,可以采用如下代码获取,该方法的参数为正常的经纬度数据,将返回以KM为单位的值:
Java代码
public static double geo_distance(double lat1, double lng1, double lat2, double lng2) { // earth's mean radius in KM double r = 6378.137; lat1 = Math.toRadians(lat1); lng1 = Math.toRadians(lng1); lat2 = Math.toRadians(lat2); lng2 = Math.toRadians(lng2); double d1 = Math.abs(lat1 - lat2); double d2 = Math.abs(lng1 - lng2); double p = Math.pow(Math.sin(d1 / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(d2 / 2), 2); double dis = r * 2 * Math.asin(Math.sqrt(p)); return dis; }
//将角度转换为弧度 public static double deg2rad(double degree) { return degree / 180 * Math.PI; } //将弧度转换为角度 public static double rad2deg(double radian) { return radian * 180 / Math.PI; }
double distance(double lat1, double lon1, double lat2, double lon2) { double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); dist = Math.acos(dist); dist = rad2deg(dist); double miles = dist * 60 * 1.1515; return miles;}
这个计算得出的结果是英里,如果要转换成公里,需要乘以1.609344,若是海里需要乘以0.8684.
最后在提供另一思路,采用weiservice请求方式,直接获取返回的更为精准的结果,例如实用国内比较有名的地图服务提供商MapABC的webservice接口:
http://search1.mapabc.com/sisserver?highLight=false&config=CDX&ver=2.0&x1= ??? &y1= ??? &x2= ??? &y2= ??? &enc=utf-8&resType=json & a_k= "your key" &ctx=1933347&a_nocache=715403361154
以json格式返回结果,使用时注意要到其官网 申请一key...