2301_82307990 2024-04-13 20:07 采纳率: 50%
浏览 9

JAVA中的字母排序

在JAVA中
1.对YNNU+姓名全拼(声母大写,韵母小写)进行排序;
2.每次变更字母位置都输出所有字母顺序,位置提前的字母用加号(+)前后包围,位置置后的字母用减号(-)前后包围;
3.遇到姓的拼音首字母移动,行末显示姓的中文,遇到名字拼音首字母移动,行末显示名字的中文;
4.如果上述两个字母都移动则行末分别显示姓和名;
5. 输出显示总共执行了多少次字母对调;
6. 最后显示排序开始时间和结束时间以及所用时长;

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 20:07
    关注

    引自免费微信小程序:皆我百晓生

    为了实现这个功能,你需要创建一个Java类,包含排序算法、字符处理逻辑以及时间测量的部分。下面是一个基本的示例代码,它实现了所需的功能。请注意,这个代码没有包含输入数据的具体获取,你可能需要根据实际场景调整这部分。

    import java.time.Duration;
    import java.time.LocalDateTime;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.List;
    
    public class NameSorter {
        private static final String NAME = "YNNU张三李四";
        private static final char[] NAME_SPLIT = {'Y', 'N', 'N', 'U'};
    
        public static void main(String[] args) {
            LocalDateTime startTime = LocalDateTime.now();
            List<Character> characters = sortName(NAME);
            LocalDateTime endTime = LocalDateTime.now();
    
            System.out.println("排序后的结果: " + characters.stream().mapToObj(c -> c == '+' || c == '-' ? c : Character.toString(c)).collect(Collectors.joining()));
            System.out.println("总共执行了" + characters.stream().filter(c -> c == '+' || c == '-').count() + "次字母对调");
            System.out.println("排序开始时间: " + startTime);
            System.out.println("排序结束时间: " + endTime);
            System.out.println("所用时长: " + Duration.between(startTime, endTime));
        }
    
        private static List<Character> sortName(String name) {
            char[] nameChars = name.toCharArray();
            int n = nameChars.length;
    
            List<Character> operations = new ArrayList<>();
            for (int i = 0; i < n - 1; i++) {
                for (int j = i + 1; j < n; j++) {
                    if (compare(nameChars[i], nameChars[j]) > 0) {
                        swap(nameChars, i, j);
                        recordOperation(operations, nameChars, i, j);
                    }
                }
            }
    
            return operations;
        }
    
        private static int compare(char a, char b) {
            for (char splitChar : NAME_SPLIT) {
                if (a == splitChar && b != splitChar) {
                    return 1;
                } else if (b == splitChar && a != splitChar) {
                    return -1;
                }
            }
            return Character.compare(a, b);
        }
    
        private static void swap(char[] chars, int i, int j) {
            char temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
    
        private static void recordOperation(List<Character> operations, char[] chars, int i, int j) {
            if (i < NAME_SPLIT.length) {
                operations.add('+');
            } else if (j < NAME_SPLIT.length) {
                operations.add('-');
            } else {
                operations.add('+');
                operations.add('-');
            }
        }
    }
    

    这段代码首先定义了一个NameSorter类,并在main方法中启动排序过程。sortName方法实现了冒泡排序算法,同时记录每一次交换操作。compare方法用于比较两个字符的顺序,swap方法用于交换数组中的元素,而recordOperation方法用于记录字母对调的操作。

    注意:这个例子使用了简单的冒泡排序算法,对于大规模的数据,可能会有性能瓶颈。在实际应用中,你可能需要选择更高效的排序算法,例如快速排序或归并排序。

    运行此程序将输出排序后的结果、执行的字母对调次数、排序开始和结束时间以及所用时长。如果你需要从用户输入或其他地方获取字符串,可以适当修改NAME变量和sortName方法的参数。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月13日

悬赏问题

  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 Ubuntu开机显示器只显示kernel,是没操作系统(相关搜索:显卡驱动)
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 在rhel8中安装qemu-kvm时遇到“cannot initialize crypto:unable to initialize gcrypt“报错”
  • ¥15 arbotix没有/cmd_vel话题
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀