Saya sedang membangun Comparator yang menyediakan kemampuan mengurutkan multi-kolom pada String yang dibatasi. Saat ini saya menggunakan metode split dari kelas String sebagai pilihan pilihan saya untuk memisahkan String mentah menjadi token.
Apakah ini cara berkinerja terbaik untuk mengubah String mentah menjadi array String? Saya akan menyortir jutaan baris jadi saya pikir pendekatan itu penting.
Tampaknya berjalan dengan baik dan sangat mudah, tetapi tidak yakin apakah ada cara yang lebih cepat di java.
Berikut ini cara kerja sortir di Comparator saya:
public int compare(String a, String b) {
String[] aValues = a.split(_delimiter, _columnComparators.length);
String[] bValues = b.split(_delimiter, _columnComparators.length);
int result = 0;
for( int index : _sortColumnIndices ) {
result = _columnComparators[index].compare(aValues[index], bValues[index]);
if(result != 0){
break;
}
}
return result;
}
Setelah membandingkan berbagai pendekatan, percaya atau tidak, metode split adalah yang tercepat menggunakan versi terbaru java. Anda dapat mengunduh komparator lengkap saya di sini: https://sourceforge.net/projects/multicolumnrowcomparator/
sumber
StringUtils.split[PreserveAllTokens](text, delimiter)
.Jawaban:
Saya telah menulis tes benchmark cepat dan kotor untuk ini. Ini membandingkan 7 metode yang berbeda, beberapa di antaranya memerlukan pengetahuan khusus tentang data yang dipecah.
Untuk pemisahan tujuan umum dasar, Guava Splitter 3.5x lebih cepat dari String # split () dan saya akan merekomendasikan menggunakannya. Stringtokenizer sedikit lebih cepat dari itu dan membelah diri Anda dengan indexOf dua kali lebih cepat lagi.
Untuk kodenya dan info lebih lanjut lihat http://demeranville.com/battle-of-the-tokenizers-delimited-text-parser-performance/
sumber
Seperti @Tom menulis, pendekatan tipe indexOf lebih cepat daripada
String.split()
, karena yang terakhir berurusan dengan ekspresi reguler dan memiliki banyak overhead tambahan untuk mereka.Namun, satu perubahan algoritma yang mungkin memberi Anda speedup super. Dengan asumsi bahwa Pembanding ini akan digunakan untuk mengurutkan ~ 100.000 String Anda, jangan menulis
Comparator<String>
. Karena, dalam proses pengurutan Anda, String yang sama kemungkinan akan dibandingkan beberapa kali, jadi Anda akan membaginya beberapa kali, dll ...Membagi semua Strings sekali dalam String [] s, dan memiliki
Comparator<String[]>
semacam String []. Kemudian, pada akhirnya, Anda bisa menggabungkan semuanya.Atau, Anda juga bisa menggunakan Peta untuk menyimpan String -> String [] atau sebaliknya. misalnya (samar) Juga perhatikan, Anda berdagang memori untuk kecepatan, harap Anda memiliki RAM lotsa
sumber
sortAndSave()
panggilan maka Anda tidak boleh kehabisan memori karena cache yang besar. IMO, kode tersebut harus memiliki beberapa kait tambahan seperti acara pembakaran atau memanggil metode yang tidak dilindungi apa pun yang dapat ditimpa oleh pengguna seperti Anda. (Juga, seharusnya tidak semua metode statis sehingga mereka dapat melakukan ini) Anda mungkin ingin menghubungi penulis dan mengajukan permintaan.Menurut tolok ukur ini , StringTokenizer lebih cepat untuk memisahkan string tetapi tidak mengembalikan array yang membuatnya kurang nyaman.
Jika Anda perlu mengurutkan jutaan baris, saya sarankan menggunakan RDBMS.
sumber
Ini adalah metode yang saya gunakan untuk mem-parsing file-file besar yang dibatasi tab (1GB +). Ini memiliki overhead jauh lebih sedikit daripada
String.split()
, tetapi terbataschar
sebagai pembatas. Jika ada yang memiliki metode yang lebih cepat, saya ingin melihatnya. Ini juga dapat dilakukan berulangCharSequence
danCharSequence.subSequence
, tetapi itu membutuhkan implementasiCharSequence.indexOf(char)
(rujuk ke metode paketString.indexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex)
jika tertarik).sumber