我可能会破坏一些学生的家庭作业,但是这里…
正如课题所建议的那样,Java的自然方法是创建一个表示您的数据的类。然后实现一个
Comparator将传递给实用方法的方法
Collections.sort。
在运行带有Java 8的Parallels虚拟机的MacBook Pro 2.3 GHz Intel Core
i7上,42,000个元素的数据集需要45-90毫秒的时间才能排序。
我更改了示例数据,使其更加有趣,引入了一些不同的日期和重复的纬度。
20000101,34.6920,-116.3550,12.30,1.2120000101,34.4420,-116.2280,7.32,1.0120000101,34.6920,-121.7667,5.88,1.1420000101,-41.1300,174.7600,27.00,1.9020000101,37.6392,-119.0482,2.40,1.0320000101,32.1790,-115.0730,6.00,2.4420000101,34.6920,-152.2192,86.34,1.4820000102,34.6320,-116.2410,11.63,1.6120000102,59.5369,-153.1360,100.15,1.6220000102,44.7357,-110.7932,4.96,2.2020000102,34.6320,-116.2950,9.00,1.7320000102,34.6320,-110.7938,5.32,1.7520000102,34.6320,-117.6320,4.15,1.4520000102,41.9270,20.5430,10.00,4.80
我的
GeoReading班代表数据。
class GeoReading{ LocalDate localDate = null; BigDecimal latitude = null; BigDecimal longitude = null; BigDecimal depth = null; BigDecimal magnitude = null; public GeoReading( String arg ) { // String is comma-separated values of: Date,Lat,Lon,Depth,Mag List<String> items = Arrays.asList( arg.split( "\s*,\s*" ) ); // Regex explained here: http://stackoverflow.com/a/7488676/642706 this.localDate = ISODateTimeFormat.basicDate().parseLocalDate( items.get( 0 ) ); this.latitude = new BigDecimal( items.get( 1 ) ); this.longitude = new BigDecimal( items.get( 2 ) ); this.depth = new BigDecimal( items.get( 3 ) ); this.magnitude = new BigDecimal( items.get( 4 ) ); } @Override public String toString() { return "GeoReading{" + "localDate=" + localDate + ", latitude=" + latitude + ", longitude=" + longitude + ", depth=" + depth + ", magnitude=" + magnitude + '}'; }}
这是比较器的实现。
class GeoReadingAscendingComparator implements Comparator<GeoReading>{ @Override public int compare( GeoReading o1 , GeoReading o2 ) { int localDateCompare = o1.localDate.compareTo( o2.localDate ); if ( localDateCompare != 0 ) { // If not equal on this component, so compare on this. return localDateCompare; } int latitudeCompare = o1.latitude.compareTo( o2.latitude ); if ( latitudeCompare != 0 ) { // If not equal on this component, so compare on this. return latitudeCompare; } return o1.longitude.compareTo( o2.longitude ); }}
主要代码。
Path path = Paths.get( "/Users/basil/lat-lon.txt" ); // Path for Mac OS X.try { List<GeoReading> list = new ArrayList<>(); Stream<String> lines = Files.lines( path ); lines.forEach( line -> list.add( new GeoReading( line ) ) ); // Take those 14 lines and multiply to simulate large text file. 14 * 3,000 = 42,000. int count = 3000; List<GeoReading> bigList = new ArrayList<>( list.size() * count ); // Initialze capacite to expected number of elements. for ( int i = 0 ; i < count ; i++ ) { bigList.addAll( list ); } long start = System.nanoTime(); Collections.sort( bigList , new GeoReadingAscendingComparator() ); long elapsed = ( System.nanoTime() - start ); System.out.println( "Done sorting the GeoReading list. Sorting " + bigList.size() + " took: " + TimeUnit.MILLISECONDS.convert( elapsed , TimeUnit.NANOSEConDS ) + " ms ( " + elapsed + " nanos )." ); System.out.println( "Dump…" ); for ( GeoReading g : bigList ) { System.out.println( g ); }} catch ( IOException ex ) { System.out.println( "ERROR - ex: " + ex );}
在现实世界中,我将添加一些防御性编程代码来验证传入的数据。来自外部来源的数据 始终 是有缺陷的和/或不断变化的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)