有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中操作2D数组数据

我有一个清单,列出了个人在一周内完成任务的开始和停止时间

当他们更改任务时,会生成一个新条目

此信息存储在2D数组中。-我想循环这个数组,并将数据存储在另一个数组中

在新的2D数组中,我希望一行显示特定日期的人

因此,如果第一个数组存储:(Person、Day、In、Out、Total)

{{"John","Mon","08:00","12:00","4.00"},
 {"John","Mon","12:00","17:00","5.00"},
 {"John","Tue","08:00","17:00","9.00"},
 {"Mike","Tue","08:00","11:00","3.00"}
 {"Mike","Tue","11:00","17:00","6.00"}};

我希望第二个数组存储:

    {{"John","Mon","08:00","17:00","9.00"},
     {"John","Tue","08:00","17:00","9.00"},
     {"Mike","Tue","08:00","17:00","9.00"}};

以下是我目前的代码:

 public class CompArrayTest {

public static void main(String args[]){

    String[][] End = new String [5][5];
    String[][] Start = {{"John","Mon","08:00","12:00","4.00"},
                        {"John","Mon","12:00","17:00","5.00"},
                        {"John","Tue","08:00","17:00","9.00"},
                        {"Mike","Tue","08:00","11:00","3.00"},
                        {"Mike","Tue","11:00","17:00","6.00"}};



    //print start 
    for(int i = 0; i<Start.length; i++){ 
      for(int j = 0; j<Start.length; j++){
          System.out.print(Start[i][j]+" ");

      }//j end
     System.out.print("\n");
    }//i end

    //change end 
    for(int i = 0; i<Start.length; i++){ 
        String name = Start[i][0];
        String day = Start[i][1];
        String In = Start[i][2];
        String Out = Start[i][3];
        String Total = Start[i][4];

       //look through End
      for(int j = 0; j<5; j++){

      String eN= End[j][0];
      String eD= End[j][1];

      if(eN==name && eD==day){
      //change end time
      End[j][3]=Start[i][3];

      //parse and add times
      double TS = Double.parseDouble(Start[i][4]);
      double TE = Double.parseDouble(End[i][4]);

      double ans = TS + TE;
      String ANS = ans+"";

      End[j][4]= ANS;


      } else {



      End[j][0] = name;
      End[j][1] = day;
      End[j][2] = In;
      End[j][3] = Out;
      End[j][4] = Total;


      }//else end


      }//j end
     System.out.print("\n");
    }//i end

 //print end 
    for(int i = 0; i<Start.length; i++){ 
      for(int j = 0; j<Start.length; j++){
          System.out.print(End[i][j]+" ");

      }//j end 
     System.out.print("\n");
    }//i end

}//main end

共 (3) 个答案

  1. # 1 楼答案

    感谢您的帮助,但我设法找到了一个解决方案,解决了在开始数组中循环时出现的问题

     for (int i = 0; i < Start.length; i++) {
            String name = Start[i][0];
            String day = Start[i][1];
            String In = Start[i][2];
            String Out = Start[i][3];
            String Total = Start[i][4];
    
            int emptyLine = 0;
            int lastLine = 0;
    
            //gets first emptyline, lastfilled line
            for (int j = 0; j < 5; j++) {
    
                if (End[j][0] == null) {
                    emptyLine = j;
                    if (j > 0) {
                        lastLine = j - 1;
    
                    }
                    break;
                }
            }//get Empty
    
            String eN = End[lastLine][0];
            String eD = End[lastLine][1];
    
            if (eN == name && eD == day) {
                //change end time
                End[lastLine][3] = Start[i][3];
    
                //parse and add times
                double TS = Double.parseDouble(Start[i][4]);
                double TE = Double.parseDouble(End[lastLine][4]);
    
                double ans = TS + TE;
                String ANS = ans + "";
    
                End[lastLine][4] = ANS;
    
               // System.out.println("Test If " + name + " " + day + " " + In + " " + Out + " " + Total);
    
            } else {
    
                End[emptyLine][0] = name;
                End[emptyLine][1] = day;
                End[emptyLine][2] = In;
                End[emptyLine][3] = Out;
                End[emptyLine][4] = Total;
    
               // System.out.println("Test Else " + name + " " + day + " " + In + " " + Out + " " + Total);
    
            }//else end
    
    
        }//i end
    

    这给了我想要的输出。不过,谢谢你关于制作员工对象的建议,我以后会用它

    启动阵列

    约翰周一08:00 12:00 4.0
    约翰周一12:00 17:00 5.0
    约翰星期二08:00 17:00 9.0
    迈克星期二08:00 11:00 3.0
    迈克周二11:00 17:00 6.0

    端阵列

    约翰周一08:00 17:00 9.0
    约翰星期二08:00 17:00 9.0
    迈克星期二08:00 17:00 9.0
    空值
    空空空空空空

  2. # 2 楼答案

    我建议你使用一个object Employee来完成一个会话集合。 对象会话:

    public class Session {
        private String day;
        private String in;
        private String out;
        private String total;
    
        Session(String day, String in, String out, String total){
            this.setDay(day);
            this.setIn(in);
            this.setOut(out);
            this.setTotal(total);
    }
        public String getDay() {
            return day;
        }
        public void setDay(String day) {
            this.day = day;
        }
        public String getIn() {
            return in;
        }
        public void setIn(String in) {
            this.in = in;
        }
        public String getOut() {
            return out;
        }
        public void setOut(String out) {
            this.out = out;
        }
        public String getTotal() {
            return total;
        }
        public void setTotal(String total) {
            this.total = total;
        }   
    }
    

    以及目标员工:

    public class Employee {
        private String name;
        private List<Session> sessions;
    
        Employee(String name){
            this.name = name;
            this.sessions = new ArrayList<Session>();
        }
    
        public boolean addSession(String day, String in, String out, String total){
            return sessions.add(new Session(day, in, out, total));
        }
    }
    

    但实施员工行为仍有一个问题。在我下面的例子中,如果Mike出现中断,会发生什么情况:

    {{"John","Mon","08:00","12:00","4.00"},
     {"John","Mon","12:00","17:00","5.00"},
     {"John","Tue","08:00","17:00","9.00"},
     {"Mike","Tue","08:00","11:00","3.00"}
     {"Mike","Tue","12:00","17:00","6.00"}
    };
    
  3. # 3 楼答案

    1)你可以为Employee创建一个类,但我的答案将涉及你选择2D数组的风格

    2)不应该为完成的数组分配5乘5的数组。当然,列的数量可能是5,但是如果您的示例中有重复的列呢

    为了解决第二个问题,我将使用for循环和一个计数器变量来迭代每个人的标识变量。在这种情况下,我假设每个“名字”都不同,所以你可以检查名字和日期是否相同,如果是,不要增加计数器。最后,你有一个完美大小的2D阵列

    下一步,创建一个算法来计算给定进出时间的工作小时数

    最后,使用另一个for循环,检查名称和日期是否相同。如果是这样,把这些小时加起来,用这些数据创建一个新行