[java] 유용한 샘플 정리

time 관련

//07:05:45PM -> 19:05:45
String s = "07:05:45PM";
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm:ssa");
Date date =(Date)formatter.parse(s);
//
SimpleDateFormat formatterOutput = new SimpleDateFormat("HH:mm:ss");
String output = formatterOutput.format(date);

Java Varargs

  • 가변인자 관련
//case1
class Add{
    public void add(Integer ...integers){
        Integer[] objects = integers;
        for(int i=0; i<objects.length; i++){
            objects[i];
        }
    }
    
    public static void display(String ...strs) {        
        for(String s: strs) {
            System.out.println(s);        
        }
    }
}
//case2

sort 관련

  • 배열(Array) 정렬 하기 ( 오름차순,내림차순 등 )
class CustomComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
       return o2.compareTo(o1); //내림차순
    }
}

String[] stringArr = new String[] {"A","C","B","E","D"};   
Arrays.sort(stringArr,new CustomComparator());   
//
List<Student> studentList = new ArrayList<Student>();
Collections.sort(studentList,new CustomComparator() );

Collections.sort(list, Collections.reverseOrder());
  • 샘플
class Student implements Comparable<Student>
{
    int ID = 0;
    String Name = "";
    double CGPA = 0;

    public Student(int id, String name, double cgpa)
    {
        this.ID = id;
        this.Name = name;
        this.CGPA = cgpa;
    }

    public int getID() { return ID; }
    public String getName() { return Name; }
    public double getCGPA() { return CGPA; }

    @Override
    public int compareTo(Student o) {

        // System.out.println("compare: " + this.Name + " " + o.Name);

        if (this.CGPA != o.CGPA) return this.CGPA - o.CGPA > 0 ? -1 : 1;
        else if(this.Name.charAt(0) != o.Name.charAt(0)) return  (this.Name.charAt(0) - o.Name.charAt(0));
        else return (this.ID - o.ID);
    }
}

Generics 관련

  • Generics
public <T> List<T> fromArrayToList(T[] a) {   
    return Arrays.stream(a).collect(Collectors.toList());
}
//The <T> in the method signature implies that the method will be dealing with generic type T. This is needed even if the method is returning void.

//As mentioned, the method can deal with more than one generic type. Where this is the case, we must add all generic types to the method signature.



//Here is how we would modify the above method to deal with type T and type G:
public static <T, G> List<G> fromArrayToList(T[] a, Function<T, G> mapperFunction) {
    return Arrays.stream(a)
      .map(mapperFunction)
      .collect(Collectors.toList());
}

패턴 관련

  • 한글, 영어, 숫자 및 특수문자 몇개(._:-) 로만 이루어졌는지 체크해보자
    //한글, 영어, 숫자 및 특수문자 몇개(._:-) 로만 이루어졌는지 체크해보자
    
    private final static Pattern NAME_PATTERN = Pattern.compile("^[ㄱ-ㅎㅏ-ㅣ가-힣a-z0-9A-Z._:-]*$");
    //
    Matcher matcher = NAME_PATTERN.matcher(inputString);
    if(!matcher.find()){
        //이상한 문자가 있음
    }
  • 입력 문자열 구조

//    // 문자열중에 "/v + 숫자" 로 시작하는 부분을 찾기

    private static Pattern URL_VERSION_PATTERN = Pattern.compile("^*[/v|/V][0-9]{1}");
    
    
    /**
     * 호출한 url정보중 version 정보를 추출하여 숫자 형태로 변환후 리턴한다.
     *  @param url http://aaa/bbb/ccc/v1.3 or http://aaa/bbb/ccc/v1.3.1/...
     *  @return 1_003_000 / 1_003_001
     */
    public static long extractVersionNumber(String url){

        Matcher matcher = URL_VERSION_PATTERN.matcher(url);

        if(matcher.find()){
            int start = matcher.start();
            int end = url.indexOf("/", matcher.start());
            //ex) url이 http://xxx/v.1.3 처럼 버전정보뒤에 /이 없는 경우
            if(end<=start){
                end = url.length();
            }
            String version = url.substring(matcher.start(), end);
            return Utils.convertVersionToNumberCode(version);
        }else{
            return -1;
        }
    }
  • IP 패턴
  // 25[0-5]        = 250-255
  // (2[0-4])[0-9]  = 200-249
  // (1[0-9])[0-9]  = 100-199
  // ([1-9])[0-9]   = 10-99
  // [0-9]          = 0-9
  // (\.(?!$))      = can't end with a dot
  private static final String IPV4_PATTERN_SHORTEST =
          "^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\\.(?!$)|$)){4}$";
  • 기타
 자주 사용하는 정규 표현식 
정규 표현식	설명
^[0-9]*$	숫자
^[a-zA-Z]*$	영문자
^[-]*$	한글
\\w+@\\w+\\.\\w+(\\.\\w+)?	E-Mail
^\d{2,3}-\d{3,4}-\d{4}$	전화번호
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$	휴대전화번호
\d{6} \- [1-4]\d{6}	주민등록번호
^\d{3}-\d{2}$	우편번호



1. 매칭될 문자를 지정하거나, 제외하는 방법입니다.
[abc]           a, b, c중 하나이면 일치 합니다.
[^abc]          a, b, c를 제외한 다른 글자 이면 일치합니다.
[a-zA-Z]        a 부터 z까지의 소문자 알파벳 이거나 A 부터 Z까지의 대문자 알파벳 중의 하나라면 일치합니다.(범위)
[a-d[m-p]]      a 부터 d까지, 또는 m 부터 p까지 중에 하나와 일치합니다: [a-dm-p] (합집합)
[a-z&&[def]]    d, e, f 중의 하나와 일치합니다. (교집합)
[a-z&&[^bc]]    b와 c를 제외한 a 부터 z까지 중의 하나와 일치합니다: [ad-z] (차집합)
[a-z&&[^m-p]]   m부터 p 까지를 제외한, a 부터 z까지 중의 하나와 일치합니다: [a-lq-z] (차집합)

2. 미리 정의된 문자를 지정하는 방법입니다.
.       임의의 문자 (라인 종결자와 일치할 수도 하지 않을 수도 있음)
\d      숫자 문자: [0-9]
\D      숫자 문자가 아닌것: [^0-9]
\s      화이트 스페이스 문자: [ \t\n\x0B\f\r]
\S      화이트 스페이스 문자가 아닌것: [^\s]
\w      알파벳 단어 문자(word 문자): [a-zA-Z_0-9]
\W      알파벳 단어 문자가 아닌것: [^\w]

6. 경계조건 판별 조건행의 시작 , 단어 경계 등을 판별합니다.
^       행의 시작
$       행의 
\b      단어 경계
\B      단어가 아닌것의 경계
\A      입력의 시작 부분
\G      이전 매치의 
\Z      입력의 끝이지만 종결자가 있는 경우
\z      입력의 

*        문자가 없을 수도 무한정 많을 수도 있음
+        문자가 하나 이상
?        문자가 없을 수도 있고 하나 있음
\       역슬래시 다음에 문자가 오면 특수문자 취급
[ ]     문자의 집합이나 범위 [] 안에서 ^기호로 시작되면 not  나타냄 ! 기호라고 생각하자!
{ }     횟수나 범위
( )     그룹지정
|       or조건


//  다음 \b은 단어 경계이며 \1첫 번째 그룹의 캡처 된 일치를 참조합니다.
// 대소문자 무시하는 옵션.

//\ b : 단어 경계의 시작
//\ w + : 모든 단어 문자
//(\ s + \ 1 \ b) * : 이전 단어와 일치하고 단어 경계로 끝나는 단어가 뒤에 오는 임의의 수의 공백. *로 묶인 모든 것은 하나 이상의 반복을 찾는 데 도움이됩니다.

//그룹화 :
//m.group (0) : 위의 경우 일치하는 그룹을 포함합니다 Goodbye goodbye GooDbYe
//m.group (1) : 위의 경우 일치하는 패턴의 첫 단어를 포함합니다 Goodbye

String regex = "\\b(\\w+)(?:\\W+\\1\\b)+";
//String regex = "\\b(\\w+)(\\s+\\1\\b)*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

Matcher m = p.matcher(input);

// Check for subsequences of input that match the compiled pattern
while (m.find()) {
     input = input.replaceAll(m.group(0), m.group(1));
}

https://wormwlrm.github.io/2020/07/19/Regular-Expressions-Tutorial.html
?:      그룹화가 필요하지만 캡처화는 필요하지 않는 경우.괄호안에 ?:  시작. 


* 이것 설명. 
Pattern r = Pattern.compile("<(.+)>([^<]+)</\\1>");

<(.+)>
matches HTML start tags. The parentheses save the contents inside the brackets into Group

#1
([^<]+)
matches all the text in between the HTML start and end tags. We place a special restriction on the text in that it can't have the "<" symbol. The characters inside the parenthesis are saved into Group #2.

</\\1>
is to match the HTML end brace that corresponds to our previous start brace. The \1 is here to match all text from Group #1.

thread pool 관련.

ExecutorService executor = Executors.newFixedThreadPool(3);
//...
for(){
    executor.execute(() -> {
        //do someting
    });
}

try {
    //Executor shutdown and awaitTermination!
    executor.shutdown();
    boolean terminated = executor.awaitTermination(30, TimeUnit.DAYS);
    //log.info("terminated: {}", terminated);
} catch (InterruptedException e) {
    log.error("", e);
}

stream 관련

  • 특정 컬럼만 쉽게 추출하기.
@Data
public class Entity {
    protected String id;
    protected String appKey;
    protected String channelType;
}
//..
List<Entity> entityList = something;
List<String> ids = entityList.stream().map(Entity::getId).collect(Collectors.toList());
  • 중복 제거하기
@Data
public class RequestCreateChannel {
    protected String channelName;
    protected List<Long> channelTagIds;
}
//..
RequestCreateChannel channel = someting;
List<Long> tagIds = new ArrayList<>(channel.getChannelTagIds()).stream().distinct().collect(Collectors.toList());
  • 데이터 형식 바꾸기
@Data
public class SimpleMember {
    protected String appId;
    protected String userId;
    protected ValidCode valid;
}

@NoArgsConstructor
public class SimpleMemberEntity extends SimpleMember {
    public SimpleMemberEntity(String appId) {
    //...
    }
    //...
}


List<SimpleMemberEntity> memberList = something;

// 전환하여 맞는 객체로 새롭게 생성하여 전달
List<SimpleMember> newMemberList = memberList.stream().map(SimpleMember::new).collect(Collectors.toList());

변환

//Strinig to int
String from = "123";
int to = Integer.parseInt(from);

//int to String
int from = 123;
String to = Integer.toString(from);

// double 형 숫자를 String으로 변환시키기.
String tmp = Double.toString(1.24657);

 

// String형 숫자를 double형으로 변환시키기.
double tmp = Double.parseDouble("1.24657");

디자인 패턴

  • factory pattern
interface Food {
	public String getType();
}

class Pizza implements Food {
	public String getType() {
		return "Someone ordered a Fast Food!";
	}
}

class Cake implements Food {
	public String getType() {
		return "Someone ordered a Dessert!";
	}
}

class FoodFactory {
	public Food getFood(String order) {
		if(order.compareTo("cake")==0){
			return new Cake();
		}else if(order.compareTo("pizza")==0){
			return new Pizza();
		}
		return null;
	}//End of getFood method
}//End of factory class

public class Solution {
	public static void main(String args[]){

		//creating the factory
		FoodFactory foodFactory = new FoodFactory();

		//factory instantiates an object
		Food food = foodFactory.getFood(sc.nextLine());

		System.out.println("The factory returned "+food.getClass());
		System.out.println(food.getType());
	}

}

기타

List<SomeEntity> result = new ArrayList<>();
result.forEach(some -> {});

Map<ChannelId, NettyChannelEntry> channelEntryMap = new ConcurrentHashMap<>();
Scanner in = new Scanner(System.in);

int[] num = new int[3]


String str = "abcde";

// reverse
StringBuffer sb = new StringBuffer(str);
String reversedStr = sb.reverse().toString();

//reverse
char[] arr = str.toCharArray(); // String -> char[]
char[] reversedArr = new char[arr.length];
for(int i=0; i<arr.length; i++){
    reversedArr[arr.length-1-i] = arr[i];
}
String reversedStr = new String(reversedArr);

//reverse
char[] arr = str.toCharArray(); // String -> char[]
List<Character> list = new ArrayList<>();
for(char each : arr){ // char[] -> List
list.add(each);
}

// reverse
Collections.reverse(list);

ListIterator li = list.listIterator();
while(li.hasNext()){
System.out.print(li.next()); // edcba
}



//문자열 분리
System.out.println("정규식으로 1칸이상의 공백 자르기");
String[] arStrRegexMultiSpace = str.split("\\s+");


//여러 구분자를 사용하려면 구분자들 사이에 |(파이프라인)을 넣어주시면 됩니다.
String []tokens=str.split(" |,");
String []tokens = s.split(" |!|,|'|\\?|@|`|\\.|, ");
//English alphabetic letters, blank spaces, exclamation points (!), commas (,), question marks (?), periods (.), underscores (_), apostrophes ('), and at symbols (@).
String[] strings = s.split("['!?,._@ ]+"); //이렇게 쓰자. 

for(int i=0;i<tokens.length;i++){
    System.out.println(tokens[i]);
}

//1. 띄어쓰기 기준으로 문자열을 분리
StringTokenizer st = new StringTokenizer(문자열); 
//2. 구분자를 기준으로 문자열을 분리
StringTokenizer st = new StringTokenizer(문자열, 구분자); 
/* 3. 구분자를 기준으로 문자열을 분리할 때 구분자도 토큰으로 넣는다. (true) * 구분자를 분리된 문자열 토큰에 포함 시키지 않는다. (false) * (디폴트 : false) */ 
StringTokenizer st = new StringTokenizer(문자열 , 구분자 , true/false);

String str = "안녕하세요 슬기로운개발생활 tistory 입니다.";        
StringTokenizer st = new StringTokenizer(str);                
    while (st.hasMoreTokens()) {            
        System.out.println(st.nextToken());        
    }
//


str.replaceAll("\\s+", " ");
정규식 "\s" 다음과 같은 종류의 공백(white space) 나타냅니다.
(\t, \n, \x0B, \f, \r)
그리고 "+" 1번이상을 의미합니다.
, "\s+" 1 이상의 공백을 의미합니다.



HashMap<String, String> map = new HashMap<String, String>();
- LinkedHashMap은 입력된 순서대로 데이터가 출력되는 특징을 가지고 있다.
= TreeMap은 입력된 key의 소트순으로 데이터가 출력되는 특징을 가지고 있다.


Stack<Integer> stack = new Stack<>();
HashSet<Integer> set = new HashSet<Integer>();

List<List<Integer>> arr = new ArrayList<>();
arr.get(a).get(b)


class Animal{}
class Bird extends Animal{
}

//
interface AdvancedArithmetic{
  int divisor_sum(int n);
}
class MyCalculator implements AdvancedArithmetic{
    
}



//sample
public class Solution {

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

			int num = 8
			Object o;
            
            Inner inner = new Inner();
            o = inner.new Private();
            Inner.Private innerPrivate = (Inner.Private) o;
            String response = innerPrivate.powerof2(num);

	}//end of main
	static class Inner{
		private class Private{
			private String powerof2(int num){
				return ((num&num-1)==0)?"power of 2":"not a power of 2";
			}
		}
	}//end of Inner
	
}//end of Solution

java reflection

try {
    Class student = Class.forName("Student");

    Method[] methods = student.getDeclaredMethods();
    ArrayList<String> methodList = new ArrayList<>();
    for (int i = 0; i < methods.length; i++) {
        Method m = methods[i];
        methodList.add(m.getName());
    }
    Collections.sort(methodList);
    for(String name: methodList){
        System.out.println(name);
    }
}
catch(Exception e){

}

java annotations

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface FamilyBudget {
	String userRole() default "GUEST";
    int roleLimit() default 200;
}

class FamilyMember {
	@FamilyBudget(userRole = "SENIOR", roleLimit=100)
	public void seniorMember(int budget, int moneySpend) {
		System.out.println("Senior Member");
		System.out.println("Spend: " + moneySpend);
		System.out.println("Budget Left: " + (budget - moneySpend));
	}

	@FamilyBudget(userRole = "JUNIOR", roleLimit=50)
	public void juniorUser(int budget, int moneySpend) {
		System.out.println("Junior Member");
		System.out.println("Spend: " + moneySpend);
		System.out.println("Budget Left: " + (budget - moneySpend));
	}
}

java lamda

import java.io.*;
import java.util.*;
interface PerformOperation {
 boolean check(int a);
}
class MyMath {
 public static boolean checker(PerformOperation p, int num) {
  return p.check(num);
 }

   // Write your code here
   PerformOperation isOdd()
   {
       PerformOperation po = (int a)-> a%2 == 0 ? false : true;
       return po;
   }
   PerformOperation isPrime()
   {
       PerformOperation po = (int a)->  
       {
           if(a == 1) return true;
           else
           {
               for (int i =  2; i < Math.sqrt(a); i++)
                    if(a%i == 0) return false;
                return true;
           }
       };
       return po;
   }
   PerformOperation isPalindrome()
   {
       ArrayList<Integer> aa = new ArrayList<>();
       PerformOperation po = (int a)->
       {
            String str = Integer.toString(a);
           String reverse = "";
           for(int i = str.length()-1; i >= 0; i--)
           {
               reverse = reverse + str.charAt(i);
           }
           if(reverse.equals(str)) return true;
           return false;
       };
       return po;
   }
   
}

public class Solution {

 public static void main(String[] args) throws IOException {
  MyMath ob = new MyMath();
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  int T = Integer.parseInt(br.readLine());
  PerformOperation op;
  boolean ret = false;
  String ans = null;
  while (T--> 0) {
   String s = br.readLine().trim();
   StringTokenizer st = new StringTokenizer(s);
   int ch = Integer.parseInt(st.nextToken());
   int num = Integer.parseInt(st.nextToken());
   if (ch == 1) {
    op = ob.isOdd();
    ret = ob.checker(op, num);
    ans = (ret) ? "ODD" : "EVEN";
   } else if (ch == 2) {
    op = ob.isPrime();
    ret = ob.checker(op, num);
    ans = (ret) ? "PRIME" : "COMPOSITE";
   } else if (ch == 3) {
    op = ob.isPalindrome();
    ret = ob.checker(op, num);
    ans = (ret) ? "PALINDROME" : "NOT PALINDROME";

   }
   System.out.println(ans);
  }
 }
}
  • 정리.
      public static void main(String[] args) throws IOException {
          BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
          BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
    
          String[] firstMultipleInput = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");
    
          int month = Integer.parseInt(firstMultipleInput[0]);
    
          int day = Integer.parseInt(firstMultipleInput[1]);
    
          int year = Integer.parseInt(firstMultipleInput[2]);
    
          String res = Result.findDay(month, day, year);
    
          bufferedWriter.write(res);
          bufferedWriter.newLine();
    
          bufferedReader.close();
          bufferedWriter.close();
      }
    
  • 배열 초기화
    int [][][] magicSqare = {
      {
      	{1,2,3,},
      	{1,2,3,},
      	{1,2,3,}
      },
      {
      	{1,2,3,},
      	{1,2,3,},
      	{1,2,3,}
      }
    };
    
  • n개중 r개 뽑기
public class Combination {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3}; //조합을 만들 배열 
        boolean[] visited = new boolean[arr.length];
 
        //1. 백트래킹을 이용해 구현
        System.out.println("-------- 1. 백트래킹 ---------");
    
        for(int r = 1; r <= arr.length; r++) {
        	System.out.println("\n" + arr.length + "개 중에 " + r  + "개 뽑음");
            comb1(arr, visited, 0, r);
        }
        
        //2. 재귀를 이용해 구현
        System.out.println("\n---------- 2. 재귀 ----------");
        
        for(int r = 1; r <= arr.length ; r++) {
        	System.out.println("\n" + arr.length + "개 중에 " + r  + "개 뽑음");
            comb2(arr, visited, 0, r);
        }
    }
 
    //1. 백트래킹을 이용해 구현
    static void comb1(int[] arr, boolean[] visited, int start, int r) {
        if(r == 0) {
            print(arr, visited);
            return;
        } else {
            for(int i = start; i < arr.length; i++) {
                visited[i] = true;
                comb1(arr, visited, i + 1, r - 1);
                visited[i] = false;
            }
        }
    }
 
    //2. 재귀를 이용해 구현
    static void comb2(int[] arr, boolean[] visited, int depth, int r) {
        if(r == 0) {
            print(arr, visited);
            return;
        }
        if(depth == arr.length) {
            return;
        } else {
            visited[depth] = true;
            comb2(arr, visited, depth + 1, r - 1);
 
            visited[depth] = false;
            comb2(arr, visited, depth + 1, r);
        }
    }
 
    // 배열 출력
    static void print(int[] arr, boolean[] visited) {
        for(int i = 0; i < arr.length; i++) {
            if(visited[i] == true)
                System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

}
  • n개중 r개 뽑기
  • 아래가 더 좋나? ```java

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

	int[] list = {0,1,2};
	int n = list.length;
	int r = 2;
	HashSet<Integer> set = new HashSet<>();
	combination(list, n, r, 0, set);
}

private static void combination(int[] list, int n, int r, int index, HashSet<Integer> set) {
	if(r==0) {
		for(int i : set) {
			System.out.print(i+" ");
		}System.out.println();
		return;
	}
	
	for(int i=index; i<n; i++) {
		set.add(i);
		combination(list, n, r-1, i+1, set);
		set.remove(i);
	}
	
} } ```
  • java 접근 제어자의 종류
접근 제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
public O O O O
protected O O O X
default O O X X
private O X X X