按多个数字对Java字符串数组进行排序

按多个数字对Java字符串数组进行排序,第1张

按多个数字对Java字符串数组进行排序

我可能会破坏一些学生的家庭作业,但是这里…

正如课题所建议的那样,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 );}

在现实世界中,我将添加一些防御性编程代码来验证传入的数据。来自外部来源的数据 始终 是有缺陷的和/或不断变化的。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5439836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存