合并 按字母顺序排序名称不起作用



所以我试图按字母顺序对文件中的名称进行排序,但它没有给我正确的输出。输入 5 个项目时,输出应为:

英属维尔京群岛、香港、卢森堡、马尔代夫、新西兰

相反,它给出了不正确的输出:

卢森堡, 新西兰,马尔代夫, 新西兰, 卢森堡

注意:起始索引是索引 1,而不是索引 0

import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
public class triall
{
public static void main(String[] args)
{
Scanner sc = new Scanner (System.in);
Scanner in = new Scanner (System.in);
System.out.print("Enter maximum number of items: ");
int num = sc.nextInt();
String [] arr1 = new String [num+1];
//String [] arr2 = new String [num+1]; 
String sLine = "";
int i;
try 
{ 
FileInputStream fstream = new FileInputStream("ioc.txt");
BufferedReader bin = new BufferedReader(new InputStreamReader(fstream));
System.out.format("%-10s%-30s%-30s", "Index", "Array 1", "Array 2");
System.out.println("");
for ( i = 1; sLine  != null && i <= num; i++)
{
sLine = bin.readLine();
arr1[i] = sLine;
arr2[i] = sLine;
if (sLine == null)
System.out.println("EOF");
else
{   System.out.format("%-10d", i);
System.out.format("%-30s", arr1[i]);
System.out.format("%-30sn", arr2[i]);
}    
}
sort (arr1);
} // end try
catch (IOException e) 
{
e.printStackTrace();
}
}

public static void merge(String[] a, int from,  int mid, int to)
{  int n1 = (mid - from + 1);
int n2 = to - mid;
// size of the range to be merged

String[] left = new String[n1 + 1];
String [] right = new String[n2 + 1];
int i = 1;
while ( i <= n1)
{
left [i] = a[from + i - 1];
}
int j = 1;
while (j <= n2)
{
right [j] = a[mid + j];
}
i = 1;
j = 1;
int k = from;
while (k <= to)
{
if (left[i].compareToIgnoreCase(right[j]) <= 0)
{
a[k] = left[i];
i++;
}
else
{
a[k] = right[j];
j++;
}
}
for (i=1; i<=to; i++)
System.out.println(a[i]);
}

public static void mergeSort(String [] a, int from, int to)
{  if (from < to)
{int mid = (int) (Math.floor((from + to) / 2));
// sort the first and the second half
mergeSort(a, from, mid);
mergeSort(a, mid + 1, to);
merge(a, from, mid, to);}
}

public static void sort(String[] a)
{  mergeSort(a, 1, a.length - 1);
}
}

你可以试一试!

import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
public class triall
{
public static void main(String[] args)
{
Scanner sc = new Scanner (System.in);
Scanner in = new Scanner (System.in);
System.out.print("Enter maximum number of items: ");
int num = sc.nextInt();
String [] arr1 = new String [num+1];
String [] arr2 = new String [num+1]; 
String sLine = "";
int i;
try 
{ 
FileInputStream fstream = new FileInputStream("ioc.txt");
BufferedReader bin = new BufferedReader(new InputStreamReader(fstream));
System.out.format("%-10s%-30s%-30s", "Index", "Array 1", "Array 2");
System.out.println("");
for ( i = 1; sLine  != null && i <= num; i++)
{
sLine = bin.readLine();
arr1[i] = sLine;
arr2[i] = sLine;
if (sLine == null)
System.out.println("EOF");
else
{   System.out.format("%-10d", i);
System.out.format("%-30s", arr1[i]);
System.out.format("%-30sn", arr2[i]);
}    
}
sort (arr1);
} // end try
catch (IOException e) 
{
e.printStackTrace();
}
}

public static void mergeSort2(String[] names) {
if (names.length >= 2) {
String[] left = new String[names.length / 2];
String[] right = new String[names.length - names.length / 2];
for (int i = 0; i < left.length; i++) {
left[i] = names[i];
}
for (int i = 0; i < right.length; i++) {
right[i] = names[i + names.length / 2];
}
merge(names, left, right);
}
}

public static void merge(String[] names, String[] left, String[] right) {
int a = 0;
int b = 0;
for (int i = 0; i < names.length; i++) {
if (b >= right.length || (a < left.length && left[a].compareToIgnoreCase(right[b]) < 0)) {
names[i] = left[a];
a++;
} else {
names[i] = right[b];
b++;
}
}
}
public static void sort(String[] a)
{  mergeSort2(a);
}
}

您可以使用 TreeSet 来避免重复并获得排序结果。

public static void main(String[] args) {
Set<String> result = new TreeSet<>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ioc.txt")))) {
String line;
while ((line = br.readLine()) != null) {
result.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(result);
// If you want result as String array 
String[] array = result.toArray(new String[result.size()]);
System.out.println(Arrays.toString(array));
}

最新更新