【问题标题】:Adding strings to an arraylist in order按顺序将字符串添加到数组列表
【发布时间】:2015-02-10 04:47:57
【问题描述】:

我正在编写一个名为 HighSchool 的类,其中包含一个名为 university 的字符串数组列表。我的目标是创建一个名为 addCollege(String c) 的方法,该方法接受字符串,检查列表,然后只要字符串不在列表中,它就会按正确的字母顺序放置。这是我到目前为止所做的,但它只对列表的第一部分进行排序。我也在尝试在没有 collections.sort 的情况下做到这一点。

    public void addCollege(String c){
    String s="";
    for(int i=0; i<=universities.size()-1; i++){
        if(c.equals(universities.get(i)))
            return;
    }
    universities.add(c);
    for(int p=1; p<=universities.size()-1; p++)
        if(universities.get(p-1).compareTo(universities.get(p))>0){
                s=universities.get(p);
                universities.set(p, universities.get(p-1));
                universities.set(p-1, s);

        }
    }

这是测试仪的内容。其中大部分与我的问题无关:

  public class schoolTester {

public static void main(String[] args) {
    School s=new School(1000, "600 Pine Lane", "Pines School", "Bob Smith");
    int[] x={4,4,4,4,4,4};
    Elementary e=new Elementary(2000, "601 Pine Lane", "Everglades", "Bobby Smith", x);
    ArrayList<String>uni=new ArrayList<String>();
    uni.add("Harvard");
    uni.add("MIT");
    uni.add("Georgia Tech");
    uni.add("UCF");
    HighSchool h=new HighSchool(4000, "602 Pine Lane", "hi-school", "bob smith", uni);
    h.addCollege("Berkely");
    h.addCollege("Miami");
    h.addCollege("FSU");
    h.addCollege("FGCU");
    System.out.println(h.getColleges());
    h.addCollege("FSU");
    System.out.println(h.getColleges());

}

}

【问题讨论】:

  • 我假设这是为了学校,排除 List.Contains() 吗?我会开始做的一件事 - 在比较名称时,在两者上添加一个 toUpper() - 或 equalsIgnoreCase() 以防万一它们出现不同的情况
  • 好主意。我注意到 java 在处理不同的情况时可能会感到困惑。
  • 它不起作用的原因是您尝试仅使用一次扫描数组进行排序假设您不想递归地执行此操作,请添加一个 while 标志 = 1; while(flag == 1){ 如果更改设置为 1,则此处的排序循环设置为 1,否则为 0}
  • 你太棒了,我的朋友!输入答案,这样我就可以给你应得的功劳

标签: java sorting arraylist


【解决方案1】:

您最好使用TreeMap

它具有防止重复的内置功能,如果您正确实施compareTo 方法,则可以按照您希望的方式对其中的项目进行排序。

【讨论】:

    【解决方案2】:

    你应该使用 TreeSet 看看下面的代码

    public class Test2 {
       public static void main(String[] args) {
        TreeSet<String> uni = new TreeSet();
        // Add elements to the tree set
        uni.add("Harvard");
        uni.add("MIT");
        uni.add("Georgia Tech");
        uni.add("UCF");
        uni.add("600 Pine Lane");
        System.out.println(uni);
      }
    }
    

    【讨论】:

      【解决方案3】:

      必须将所有字符串转换为相同的大小写,并运行我的排序的更多迭代。感谢乔丹弗莱尔:

        public void addCollege(String c){
          String s="";
          for(int i=0; i<=universities.size()-1; i++){
              if(c.equals(universities.get(i)))
                  return;
          }
          universities.add(c);
          for(int t=0; t<universities.size(); t++){
          for(int p=1; p<=universities.size()-1; p++)
              if(universities.get(p-1).compareTo(universities.get(p))>0){
                      s=universities.get(p);
                      universities.set(p, universities.get(p-1));
                      universities.set(p-1, s);
      
              }
          }
          }
      

      【讨论】:

        【解决方案4】:

        因为这看起来像是针对学校的,所以我会为所有编码问题指出正确的方向:

        1. 将您的算法分解为多个部分(即方法)
        2. 描述性地命名所有内容

        这会给你一个良好的开端。唯一可以避免使用单字母变量名的就是循环变量,尽管这(按照惯例)通常是 i、j 或 k。

        如果您这样做,将更容易看到发生了什么。这是我在稍微清理你的代码后得到的结果(尽量不改变算法)。我也没有包含universityAlreadyAdded(String) 方法,因为它目前并不重要。

        List<String> universities = new ArrayList<>();
        
        public void addUniversity(String university) {
            if(universityAlreadyAdded(university)) {
                return;
            }
        
            universities.add(university);
        
            siftLastUniversityIntoSortedPosition();
        }
        
        public void siftLastUniversityIntoSortedPosition() {
            for(int p = 1; p <= universities.size() - 1; p++) {
                String currentUni = universities.get(p - 1);
                String nextUni = universities.get(p);
                if(currentUni.compareTo(nextUni) > 0) {
                        swapElementsAtIndices(p - 1, p);
                }
            }
        }
        

        查看siftLastUniversityIntoSortedPosition() 方法(至少在我看来,您正在尝试这样做),您可以看到问题是您想将最后添加的元素筛选到排序位置,但您的@987654324 @循环正在上升。

        如果不亲自尝试,也许您可​​以尝试让您的算法从universities.size() - 1 开始并倒计时。这意味着您实际上可以将最后一个元素向下移动(因为这是唯一尚未排序的元素)。 这样你的循环就会开始:

        for(int p = universities.size() - 1; p >= 0; p--) {
        

        剩下的留给你试验和完成!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-31
          • 1970-01-01
          • 2015-03-21
          • 2013-12-28
          • 2013-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多