HDFS 의 고급 API 조작 각종 자바 조작 demo [전재]

28436 단어 Hadoop 시리즈Java
원본 링크:https://www.cnblogs.com/frankdeng/p/9061449.html
원본 링크:https://www.cnblogs.com/frankdeng/p/9061449.html
HDFS 클 라 이언 트 환경 준비 1.1 jar 패키지 준비 1) hadop - 2.7.6. tar. gz 에서 비 중국어 디 렉 터 리 로 압축 풀기
2) share 폴 더 에 들 어가 모든 jar 가방 을 찾 아 jar 가방 을 복사lib 폴 더 아래
3) 모든 jar 가방 에서 sources. jar 를 찾 아 잘라 서source 폴 더.
4) 모든 jar 가방 에서 tests. jar 를 찾 아 잘라 서테스트 폴 더
1.2 Eclipse 준비 1) 자신의 컴퓨터 운영 체제 에 따라 컴 파일 된 hadop jar 를 중국어 가 아 닌 경로 로 패키지 합 니 다 (예 를 들 어 E:\02 software\hadop - 2.7.6).(유효 하지 않 으 면 eclipse 를 다시 시작 합 니 다)
2) HADOOP 설정HOME 환경 변수
3) 첫 번 째 자바 프로젝트 HdfsClient Demo 1 만 들 기
4) lib 폴 더 를 만 들 고 jar 패 키 지 를 추가 합 니 다.
5) 패키지 생 성, HdfsClient 테스트 클래스
public class HdfsClient {

    //     
    public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {

        // 1       
        Configuration configuration = new Configuration();
        //         
        // configuration.set("fs.defaultFS", "hdfs://node21:9000");
        // FileSystem fs = FileSystem.get(configuration);
        FileSystem fs = FileSystem.get(new URI("hdfs://node21:9000"), configuration, "admin");
        // 2     
        fs.copyFromLocalFile(new Path("e:/hello.txt"), new Path("/hello2.txt"));
        // 3     
        fs.close();
        System.out.println("over");
    }
}

6) 실행 프로그램
실행 할 때 사용자 이름 을 설정 해 야 합 니 다. 클 라 이언 트 가 hdfs 를 조작 할 때 사용자 신분 이 있 습 니 다.기본적으로 hdfs 클 라 이언 트 api 는 jvm 에서 사용자 신분 으로 인 자 를 가 져 옵 니 다: - DADOOPUSER_NAME = admin, admin 은 사용자 이름 입 니 다.
7) 메모: eclipse 에서 로 그 를 출력 하지 못 하면 콘 솔 에 만 표 시 됩 니 다.
1.log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).   2.log4j:WARN Please initialize the log4j system properly.   3.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 프로젝트 의 src 디 렉 터 리 에 'log4j. properties' 라 는 이름 으로 파일 을 새로 만들어 야 합 니 다.
log4j.rootLogger=INFO, stdout   log4j.appender.stdout=org.apache.log4j.ConsoleAppender   log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n   log4j.appender.logfile=org.apache.log4j.FileAppender   log4j.appender.logfile.File=target/spring.log   log4j.appender.logfile.layout=org.apache.log4j.PatternLayout   log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n   2 HDFS 의 고급 API 프로 그래 밍 2.1 HDFS 파일 업로드 (테스트 매개 변수 우선 순위) 1. 코드
@Test
public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {

// 1       
Configuration configuration = new Configuration();
configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(new URI("hdfs://node21:9000"), configuration, "admin");
// 2     
fs.copyFromLocalFile(new Path("e:/hello.txt"), new Path("/hello5.txt"));
// 3     
fs.close();
System.out.println("over");
} 

2. hdfs - site. xml 을 프로젝트 의 루트 디 렉 터 리 에 복사



  
    dfs.replication
    1
  

3. 테스트 매개 변수 우선 순위
매개 변수 우선 순위: (1) 클 라 이언 트 코드 에 설 치 된 값 > (2) classpath 의 사용자 정의 프로필 > (3) 그리고 서버 의 기본 설정 2.2 파일 의 업로드 와 다운로드 
package com.xyg.hdfs.api;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HDFS_GET_AND_PUT {

    public static void main(String[] args) throws Exception {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        conf.set("dfs.replication", "2");
        FileSystem fs = FileSystem.get(conf);      
        
        /**
         *            :
         * 1、             hadoop
         * VM arguments ;   -DHADOOP_USER_NAME=admin 
         * 2、        
         * System.setProperty("HADOOP_USER_NAME", "admin");
         */
        System.setProperty("HADOOP_USER_NAME", "admin");
        
        //   
        fs.copyFromLocalFile(new Path("c:/sss.txt"), new Path("/a/ggg.txt"));     
        
        /**
         * .crc  :     
         *                         :  qqq.txt  blk_41838 :  0 - 1100byte
         *            。           。
         *          ,       0 -1100                。      CRC         ,      HDFS    
         *    。HDFS             。
         */
        
        //    
        fs.copyToLocalFile(new Path("/a/qqq.txt"), new Path("c:/qqq3.txt"));
        
        /**
         *       API          : FileUtil.copy(....)
         */
        
        fs.close();
    }
}

2. 프로필 conf
package com.xyg.hdfs;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map.Entry;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;

public class TestConf1 {

    public static void main(String[] args) throws Exception {
        
        
        /**
         *             :
         * 
         * core-default.xml
         * hdfs-default.xml
         * mapred-default.xml
         * yarn-default.xml
         */
        Configuration conf = new Configuration();
//        conf.addResource("hdfs-default.xml");
        
        /**
         *     hdfs-site.xml            src 。   classpath   。
         *    FS       ,  hdfs-site.xml      name-value    conf 
         *   :
         * 1、  hdfs-site.xml   src ,       ???    
         * 2、         hdfs-default.xml    hdsf-site.xml          ???    
         *      :
         *                     ,            -default.xml  -site.xml   
         *        src 
         * 
         *         ,    src ,               :      
         *     conf              
         */
//        conf.addResource("hdfs-site.xml");
        conf.set("dfs.replication", "1");
        conf.addResource("myconfig/hdfs-site.xml");
                
        /**
         *              :
         * 1、   core/hdfs/mapred/yarn-default.xml
         * 2、    conf.addResources()       
         * 3、  conf.set(name, value)
         */
        
        FileSystem fs = FileSystem.get(conf);
        
        System.out.println(conf.get("dfs.replication"));
        
        Iterator> iterator = conf.iterator();
        while(iterator.hasNext()){
            Entry e = iterator.next();
            System.out.println(e.getKey() + "\t" + e.getValue());
        }
    }
}

출력 결과
 View Code 3, 지정 한 디 렉 터 리 에 있 는 파일 과 블록 에 대한 정 보 를 보 여 줍 니 다.
package com.xyg.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

public class TestHDFS1 {

    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();
        System.setProperty("HADOOP_USER_NAME", "admin");
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        FileSystem fs = FileSystem.get(conf);

        /**
         *              
         */
        RemoteIterator listFiles = fs.listFiles(new Path("/"), true);
        while(listFiles.hasNext()){
            LocatedFileStatus file = listFiles.next();
            
            
            System.out.println(file.getPath()+"\t");
            System.out.println(file.getPath().getName()+"\t");
            System.out.println(file.getLen()+"\t");
            System.out.println(file.getReplication()+"\t");
            
            /**
             * blockLocations     ?       ?
             * 
             *     
             */
            BlockLocation[] blockLocations = file.getBlockLocations();
            System.out.println(blockLocations.length+"\t");
            
            for(BlockLocation bl : blockLocations){
                String[] hosts = bl.getHosts();
                
                System.out.print(hosts[0] + "-" + hosts[1]+"\t");
            }
            System.out.println();
            
        }
        
        
    }
}

출력 결과
hdfs://hadoop1:9000/aa/bb/cc/hadoop.tar.gz     hadoop.tar.gz     199007110     2     3     hadoop3-hadoop1    hadoop1-hadoop2    hadop 1 - hadop 4, 파일 업로드
package com.xyg.hdfs;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class UploadDataByStream {

    public static void main(String[] args) throws Exception {    
        
        Configuration conf = new Configuration();
        System.setProperty("HADOOP_USER_NAME", "admin");
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        FileSystem fs = FileSystem.get(conf);
        
        InputStream in = new FileInputStream(new File("d:/abc.tar.gz"));
        FSDataOutputStream out = fs.create(new Path("/aa/abc.tar.gz"));
          
        IOUtils.copyBytes(in, out, 4096, true);
        
        fs.close();  
    }
}

5. 파일 다운로드
package com.xyg.hdfs;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class DownloadDataByStream {
  
    public static void main(String[] args) throws Exception {
        
        Configuration conf = new Configuration();
        System.setProperty("HADOOP_USER_NAME", "admin");
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        FileSystem fs = FileSystem.get(conf);
        
        FSDataInputStream in = fs.open(new Path("/aa/abc.tar.gz"));
        OutputStream out = new FileOutputStream(new File("D:/abc.sh"));
        
        IOUtils.copyBytes(in, out, 4096, true);
        
        fs.close(); 
    }
}

6. 특정한 경로 에서 특정한 유형의 파일 을 삭제 합 니 다. 예 를 들 어 class 형식 파일, 예 를 들 어 txt 형식 파일 등 입 니 다.
package com.xyg.hdfs;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HDFS_DELETE_CLASS {
    
    public static final String FILETYPE = "tar.gz";
    public static final String DELETE_PATH = "/aa";
    
    public static void main(String[] args) throws Exception {
        
        new HDFS_DELETE_CLASS().rmrClassFile(new Path(DELETE_PATH));
    }
    
    public void rmrClassFile(Path path) throws Exception{
        
        //            ,   FileSystem     fs
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node2:9000"), conf, "admin");
        
        //     path          
        FileStatus fileStatus = fs.getFileStatus(path);
        boolean directory = fileStatus.isDirectory();
        
        //                       
        if(directory){
            //      
            checkAndDeleteDirectory(path, fs);
        }else{
            //      ,         FILETYPE     
            checkAndDeleteFile(path, fs);
        }
    }
    
    //     
    public static void checkAndDeleteDirectory(Path path, FileSystem fs) throws Exception{
        //    path               
        FileStatus[] listStatus = fs.listStatus(path);
        for(FileStatus fStatus: listStatus){
            Path p = fStatus.getPath();
            //      ,    FILETYPE  ,   ,           
            if(fStatus.isFile()){
                checkAndDeleteFile(p, fs);
            }else{
                checkAndDeleteDirectory(p, fs);
            }
        }
    }
    
    //             ,         ,          
    public static void checkAndDeleteFile(Path path, FileSystem fs) throws Exception{
        String name = path.getName();
        System.out.println(name);
        /*//        FILETYPE     ,      ,       ,         FILETYPE  
        if(name.indexOf(FILETYPE) != -1){
            fs.delete(path, true);
        }*/
        //       FILETYPE  
        int startIndex = name.length() - FILETYPE.length();
        int endIndex = name.length();
        //        
        String fileSuffix = name.substring(startIndex, endIndex);
        if(fileSuffix.equals(FILETYPE)){
            fs.delete(path, true);
        }
    }
}

7. HDFS 클 러 스 터 의 모든 빈 파일 과 빈 디 렉 터 리 삭제
public class DeleteEmptyDirAndFile {
    
    static FileSystem fs = null;

    public static void main(String[] args) throws Exception {
        
        initFileSystem();

//               
//        makeTestData();

        //       
//        deleteTestData();

        //                  
        deleteEmptyDirAndFile(new Path("/aa"));
    }
    
    /**
     *                     
     * @throws Exception 
     */
    public static void deleteEmptyDirAndFile(Path path) throws Exception {
        
        //       
        FileStatus[] listStatus = fs.listStatus(path);
        if(listStatus.length == 0){
            fs.delete(path, true);
            return;
        }
        
        //       :                 
        RemoteIterator listLocatedStatus = fs.listLocatedStatus(path);
        
        while (listLocatedStatus.hasNext()) {
            LocatedFileStatus next = listLocatedStatus.next();

            Path currentPath = next.getPath();
            //      
            Path parent = next.getPath().getParent();
            
            //       ,      ,         (    )
            if (next.isDirectory()) {
                
                //        
                if(fs.listStatus(currentPath).length == 0){
                    //    
                    fs.delete(currentPath, true);
                }else{
                    //       ,       
                    if(fs.exists(currentPath)){
                        deleteEmptyDirAndFile(currentPath);
                    }
                }
                
            //      
            } else {
                //        
                long fileLength = next.getLen();
                //         ,   
                if(fileLength == 0){
                    fs.delete(currentPath, true);
                }
            }
            
            //              ,              ,
            //                           ,      ,              
            int length = fs.listStatus(parent).length;
            if(length == 0){
                fs.delete(parent, true);
            }
        }
    }
    
    /**
     *    FileSystem    
     */
    public static void initFileSystem() throws Exception{
        Configuration conf = new Configuration();
        System.setProperty("HADOOP_USER_NAME", "admin");
        conf.addResource("config/core-site.xml");
        conf.addResource("config/hdfs-site.xml");
        fs = FileSystem.get(conf);
    }

    /**
     *           
     */
    public static void makeTestData() throws Exception {
        
        String emptyFilePath = "D:\\bigdata\\1704mr_test\\empty.txt";
        String notEmptyFilePath = "D:\\bigdata\\1704mr_test\
otEmpty.txt";         //         String path1 = "/aa/bb1/cc1/dd1/";         fs.mkdirs(new Path(path1));         fs.mkdirs(new Path("/aa/bb1/cc1/dd2/"));         fs.copyFromLocalFile(new Path(emptyFilePath), new Path(path1));         fs.copyFromLocalFile(new Path(notEmptyFilePath), new Path(path1));         //         String path2 = "/aa/bb1/cc2/dd2/";         fs.mkdirs(new Path(path2));         fs.copyFromLocalFile(new Path(emptyFilePath), new Path(path2));         //         String path3 = "/aa/bb2/cc3/dd3";         fs.mkdirs(new Path(path3));         fs.copyFromLocalFile(new Path(notEmptyFilePath), new Path(path3));         //         String path4 = "/aa/bb2/cc4/dd4";         fs.mkdirs(new Path(path4));         System.out.println(" ");     }     /**      *      * @throws Exception       */     public static void deleteTestData() throws Exception {         boolean delete = fs.delete(new Path("/aa"), true);         System.out.println(delete ? " " : " ");     } }

8. 특정한 데이터 블록 을 수 동 으로 복사 합 니 다 (예 를 들 어 특정한 파일 의 두 번 째 데이터 블록)
/**
     *             (             )
     * */
    public static void copyBlock(String str,int num) {
        
        Path path = new Path(str);
        
        BlockLocation[] localtions = new BlockLocation[0] ;
        
        try {
            FileStatus fileStatus = fs.getFileStatus(path);
            
            localtions = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
            
            /*for(int i=0;i

9. 프로그램 을 작성 하여 HDFS 파일 시스템 의 파일 크기 가 HDFS 클 러 스 터 의 기본 블록 크기 보다 작은 파일 비례 를 통계 합 니 다.
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

/**
 *        HDFS           HDFS              
 *   :    128M      98,  128M      2,     2%
 */
public class Exam1_SmallFilePercent {
    
    private static int DEFAULT_BLOCKSIZE = 128 * 1024 * 1024;

    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        System.setProperty("HADOOP_USER_NAME", "admin");
        FileSystem fs = FileSystem.get(conf);

        Path path = new Path("/");
        float smallFilePercent = getSmallFilePercent(fs, path);
        System.out.println(smallFilePercent);

        fs.close();
    }

    /**
     *                       
     * @throws Exception 
     */
    private static float getSmallFilePercent(FileSystem fs, Path path) throws Exception {
        // TODO Auto-generated method stub
        
        int smallFile = 0;
        int totalFile = 0;
        
        RemoteIterator listFiles = fs.listFiles(path, false);
        while(listFiles.hasNext()){
            totalFile++;
            LocatedFileStatus next = listFiles.next();
            long len = next.getLen();
            if(len < DEFAULT_BLOCKSIZE){
                smallFile++;
            }
        }
        System.out.println(smallFile+" : "+totalFile);
        
        return smallFile * 1f /totalFile;
    }
    
}

10. 프로그램 을 작성 하여 HDFS 파일 시스템 의 평균 데이터 블록 수 (데이터 블록 총수/파일 총수) 를 통계 합 니 다.
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

/**
 *        HDFS            (     /    )
 *   :     5  ,     3  ,         4
 *         ,      1 ,    HDFS         3
 */
public class Exam2_HDSFAvgBlocks {
    
    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        System.setProperty("HADOOP_USER_NAME", "admin");
        FileSystem fs = FileSystem.get(conf);

        Path path = new Path("/");
        float avgHDFSBlocks = getHDFSAvgBlocks(fs, path);
        System.out.println("HDFS         :" + avgHDFSBlocks);
 
        fs.close();
    }

    /**
     *                     
     */
    private static float getHDFSAvgBlocks(FileSystem fs, Path path) throws Exception {
        // TODO Auto-generated method stub
        
        int totalFiles = 0;        //     
        int totalBlocks = 0;    //      
        
        RemoteIterator listFiles = fs.listFiles(path, false);
        
        while(listFiles.hasNext()){
            LocatedFileStatus next = listFiles.next();
            int length = next.getBlockLocations().length;
            totalBlocks += length;
            if(next.getLen() != 0){
                totalFiles++;
            }
        }
        System.out.println(totalBlocks+" : "+totalFiles);
        
        return totalBlocks * 1f / totalFiles;
    }
    
}

11. 작성 자 는 HDFS 파일 시스템 의 평균 사본 수 (사본 총수/총 데이터 블록 수) 를 집계 합 니 다.
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

/**
 *        HDFS           (    /     )
 *   :      ,    5    ,     3   ,     2    ,    2   ,         = (3*3 + 2*2)/(3+2)= 2.8
 */
public class Exam3_HDSFAvgBlockCopys {
    
    public static void main(String[] args) throws Exception {     
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        System.setProperty("HADOOP_USER_NAME", "admin");
        FileSystem fs = FileSystem.get(conf);

        Path path = new Path("/");
        float avgHDFSBlockCopys = getHDFSAvgBlockCopys(fs, path);
        System.out.println("HDFS         :" + avgHDFSBlockCopys);
        
        fs.close();
    }

    /**
     *                     
     */
    private static float getHDFSAvgBlockCopys(FileSystem fs, Path path) throws Exception {
        // TODO Auto-generated method stub
        
        int totalCopy = 0;        //     
        int totalBlocks = 0;    //      
        
        RemoteIterator listFiles = fs.listFiles(path, false);
        
        while(listFiles.hasNext()){
            LocatedFileStatus next = listFiles.next();

            int length = next.getBlockLocations().length;
            short replication = next.getReplication();
            
            totalBlocks += length;
            totalCopy += length * replication;
        }
        System.out.println(totalCopy+" : "+totalBlocks);
        
        return totalCopy * 1f / totalBlocks;
    }
    
}

12. HDFS 전체 파일 시스템 에서 지정 한 데이터 블록 크기 가 부족 한 데이터 블록 의 비율 을 통계 합 니 다.
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

/**
 *   HDFS                        
 *            128M,     100 ,        128M     5 ,                    5%
 *   :                       。          128M    
 */
public class Exam4_LTBlockSize {

    public static void main(String[] args) throws Exception {
        
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://node21:9000");
        System.setProperty("HADOOP_USER_NAME", "admin");
        FileSystem fs = FileSystem.get(conf);
        
        Path path = new Path("/");
        float avgHDFSBlockCopys = getLessThanBlocksizeBlocks(fs, path);
        System.out.println("HDFS                 :" + avgHDFSBlockCopys);
        
        fs.close();
    }

    private static float getLessThanBlocksizeBlocks(FileSystem fs, Path path) throws Exception {
        // TODO Auto-generated method stub
        
        int totalBlocks = 0;                //     
        int lessThenBlocksizeBlocks = 0;    //      
        
        RemoteIterator listFiles = fs.listFiles(path, false);
        
        while(listFiles.hasNext()){
            LocatedFileStatus next = listFiles.next();

            BlockLocation[] blockLocations = next.getBlockLocations();
            int length = blockLocations.length;
            
            if(length != 0){
                totalBlocks += length;
                long lastBlockSize = blockLocations[length - 1].getLength();
                long blockSize = next.getBlockSize();
                if(lastBlockSize < blockSize){
                    lessThenBlocksizeBlocks++;
                }
            }
        }
        System.out.println(lessThenBlocksizeBlocks+" : "+totalBlocks);
        
        return lessThenBlocksizeBlocks * 1f / totalBlocks;
    }
}

13. 주어진 배열 의 저수 총량 을 통계 한다. (배열 의 모든 위치 수 를 지세 의 높 고 낮 음 으로 본다)
/**
                      (                 )
          :int[] intArray = new int[]{4,3,2,5,6,4,4,7}
           :[0,1,2,0,0,2,2,0]      :7
        
        :         01  ,     01  ,    01      0    (        1       0   )  
 */
public class Exam5_WaterStoreOfArray {

    public static void main(String[] args) {
        
//        int[] intArray = new int[]{4,3,2,5,6,4,4,7};
//        int[] intArray = new int[]{1,2,3,4,5,6};
        int[] intArray = new int[]{3,1,2,7,3,8,4,9,5,6};
        
        int totalWater = getArrayWater(intArray);
        System.out.println(totalWater);
    }
    
    /**
     *         
     */
    private static int getArrayWater(int[] intArray) {
        
        int findMaxValueOfArray = findMaxValueOfArray(intArray);
        int findMinValueOfArray = findMinValueOfArray(intArray);
        int length = intArray.length;
        
        int totalWater = 0;
        
        //                
        for(int i=findMinValueOfArray; i i){
                    tempArray[j] = 1;
                }else{
                    tempArray[j] = 0;
                }
            }
            //      01     0  
            int waterOfOneZeroArray = getWaterOfOneZeroArray(tempArray);
            totalWater += waterOfOneZeroArray;
        }
        return totalWater;
    }
    

    /**
     *      :         1,     1     0   ,    
     */
    private static int getWaterOfOneZeroArray(int[] tempArray) {
        
        int length = tempArray.length;
        int toatalWater = 0;
        
        //     1
        int i = 0;
        while(i < length){
            if(tempArray[i] == 1){
                break;
            }
            i++;
        }
        
        //       1
        int j=length-1;
        while(j >= i){
            if(tempArray[j] == 1){
                break;
            }
            j--;
        }
        
        //      1   0   。
        if(i == j || i + 1 == j){
            return 0;
        }else{
            for(int k=i+1; k max){
                    max = intArray[i];
                }
            }
            return max;
        }
    }
    
    /**
     *            
     */
    public static int findMinValueOfArray(int[] intArray){
        int length = intArray.length;
        if(length == 0){
            return 0;
        }else if(length == 1){
            return intArray[0];
        }else{
            int min = intArray[0];
            for(int i=1; i

좋은 웹페이지 즐겨찾기